2010-11-15 71 views
0

如果我有這樣一些數據: 模型MODELNAME代碼 阿里斯1.2 1 阿里斯1.3 2 花冠1.1 3 花冠1.4 4LINQ的LAMBDA GROUPBY和投影問題

我想創建與一個GROUPBY查詢新的投影是這樣的:

var vehicles = _vehicleRepository.GroupBy(x=>new {x.Model,x.ModelName,x.Code}) 
        .Select(g => new { Text = g.Key.Model + " - " + g.Key.ModelName, g.Key.Code }) 
        .ToList(); 

看來我有文本= g.Key.Model +困難 「 - 」 + g.Key.ModelName,它會導致SQL錯誤

任何提示讚賞

+0

*這會導致什麼* SQL錯誤? – 2010-11-15 07:12:56

+0

它會導致SQL錯誤,還是會導致客戶端的異常無法轉換爲SQL或其他相關內容,但不會導致執行查詢時出錯?這是個很大的差異。 – jason 2010-11-15 08:38:23

+0

SQL錯誤。問題似乎與SQL生成 – Chev 2010-11-16 06:39:00

回答

2

這樣做的簡單的解決辦法可能僅僅是在客戶端,而不是進行串聯:

var vehicles = _vehicleRepository.GroupBy(x => new {x.Model,x.ModelName,x.Code}) 
       .Select(g => g.Key) 
       .AsEnumerable() 
       .Select(k => new { Text = k.Model + " - " + k.ModelName, 
            k.Code }) 
       .ToList(); 

這裏AsEnumerable有效地使查詢其他人只是在調用點上運行,在.NET中。我已經包含了一個額外的投影到只需從每個組獲得密鑰,以便不會傳輸超過必要的數據。

另一種選擇可能是使用Distinct

var vehicles = _vehicleRepository.Select(x => new {x.Model,x.ModelName,x.Code}) 
       .Distinct() 
       .AsEnumerable() 
       .Select(k => new { Text = k.Model + " - " + k.ModelName, 
            k.Code }) 
       .ToList(); 

這有可能是你不需要調用AsEnumerable在這裏 - 你當然可以嘗試刪除它。

+0

感謝Jon的回覆,但無法讓他們運行。 – Chev 2010-11-15 08:27:48

+0

正如我知道你的AsEnumerable()獲取所有數據,這是真的嗎?如果是,最好不要使用linq來運行存儲過程。 – 2010-11-15 09:32:53

+0

PS喬恩 - 我擁有你的書! – Chev 2010-11-15 13:55:47