2014-09-03 91 views
2

我想按列分組並獲取計數,然後使用結果創建字典。最後一條語句返回錯誤DbExpressionBinding需要一個輸入表達式和一個集合ResultType

DbExpressionBinding需要輸入表達式和集合ResultType。

錯誤的含義是什麼?

var a = context.Table; 
var b = a.GroupBy(x => x.RecordType, (k, cnt) => new { RecType = k, cnt = k.Count() }); 
var c = b.Select(x => 
    new KeyValuePair<string, Tuple<Type, int>>(
     x.RecType, Tuple.Create(ObjTypes[x.RecType], x.cnt))) 
    .ToDictionary(x => x.Key, x => x.Value); 

回答

3

GroupBy呼叫稍有不當 - 它忽略了cnt參數。它應該這樣寫:

var b = a.GroupBy(x => x.RecordType, (k, cnt) => new { RecType = k, cnt = cnt.Count() }); 

這個異常消息是我見過的更沒有用的東西之一。問題是,當您在C#表達式中調用CountRecordType(別名爲k)時,編譯良好,因爲string實現了IEnumerable<char>。不幸的是,當EF試圖將該表達式轉換爲SQL時,它需要能夠使用SQL count運算符,該運算符無法在string上工作 - 它需要在一系列行上運行。這會導致您收到的有點神祕的例外情況。

順便提一下,分配給c的查詢將不起作用 - Tuple.Create不能轉換爲SQL,也不能轉換爲ObjTypes[x.RecType]。您需要在變量b上調用ToList,然後才能對結果進行所有額外修改。

+0

這就是爲什麼我們使用有意義的變量名作爲參數,即使是lambda表達式。 – Servy 2014-09-03 20:48:50

+1

@ dc7a9163d9「KeyValuePair」的結構不在受支持的莊園中。只需完全移除「選擇」並在「ToDictionary」調用中進行投影。 – Servy 2014-09-03 20:49:25

+0

@ dc7a9163d9,看我更新的答案。 – 2014-09-03 20:49:38

相關問題