2016-06-15 33 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