2016-06-15 54 views
0

嵌套屬性動態地表達我使用的nhibernate映射由代碼,我想使這個表達式dynamicllay(具有嵌套的對象)生成LINQ GROUPBY與來自串

我有一個具有多對一與的關係的類別事件事件狀態/我想通過代碼表中的事件狀態,以分組

var grouping = query.GroupBy(x => x.EventState.Code) 

它爲我用一個簡單的屬性,這裏是我的代碼:

var arg = Expression.Parameter(type, categoryColumnName); 
var bodyy = Expression.Convert(Expression.Property(arg, categoryColumnName), typeof (object)); 
var lambdaGroupBy = Expression.Lambda<Func<Operation, object>>(bodyy, arg); 

var keySelector = lambdaGroupBy.Compile(); 
var grouping = query.GroupBy(keySelector); 
return grouping.Select(a => new PieChartObject { Category = a.Key.ToString(), Value = a.Count().ToString() }).ToList(); 

但我不能用嵌套對象來做。

+0

我在我的模型中創建了一個包含來自EventState表的代碼的屬性,但我面臨性能問題 – SamirJ

+0

嵌套對象的類型是什麼? – Georg

+0

「代碼」的類型是一個字符串 – SamirJ

回答

0

GroupBy將按照您提供的關鍵選擇器劃分您的查詢。要確定查詢中的兩個項目是否具有相同的密鑰,它將使用給定類型的默認比較器。對於對象,這是使用EqualsGetHashCode方法,反過來對於字符串意味着字符串的內容是相同的。如果您使用的是課程,默認情況下會使用參考身份,所以我認爲GroupBy沒有做任何事情,因爲您提供的密鑰不相同,即使它們可能具有相同的值。

所以有兩種有效的解決方案:你可以在你的嵌套對象類中覆蓋Equals和GetHashCode,或者你可以爲GroupBy提供一個自定義的鍵比較器,如果你只想爲這個特定的查詢使用這種行爲。但我想,因爲你想要通用,所以實現Equals和GetHashCode會是更好的選擇。唯一的例外是當你不能這樣做時,例如因爲它是一個編譯器生成的類。在這種情況下,你可以做的事情很少。

+0

如何?我不明白! – SamirJ

+0

如何?我不明白!我的模型中創建了一個包含來自EventState表的代碼的屬性,但是我面臨性能問題 – SamirJ

+0

@SamirJ此鏈接可能有助於如何覆蓋Equals和GetHashCode:https://msdn.microsoft.com /en-us/library/ms173147(v=vs.90).aspx – Georg