有没有人用linq对实体做一个更整洁的方法?
我试图让每个组中的项目具有最高的X,Y或Z,例如最大(X,Y,Z)
var points = from g in groupedData
from ep in g
where (ep.X > ep.Y ?
ep.X > ep.Z ? ep.X : ep.Z
: ep.Y > ep.Z ? ep.Y : ep.Z)
== g.Max(e => e.X > e.Y ?
e.X > e.Z ? e.X : e.Z
: e.Y > e.Z ? e.Y : e.Z)
select ep;
答案 0 :(得分:3)
var points = from g in groupedData
let gMax = g.Max(e => e.X > e.Y ?
(e.X > e.Z ? e.X : e.Z)
: (e.Y > e.Z ? e.Y : e.Z))
from ep in g
where ep.X == gMax
|| ep.Y == gMax
|| ep.Z == gMax
select ep;
PS:Linq2SQL还是Linq2Entities?因为你标记了“EF”!
编辑:我刚刚成功测试了这个:
var points = from g in groupedData
let gMax = g.Max(e => new int[] { e.X, e.Y, e.Z }.Max())
from ep in g
where ep.X == gMax
|| ep.Y == gMax
|| ep.Z == gMax
select ep;
你确认它适用于你的情况吗?
答案 1 :(得分:0)
我会创建一个扩展方法来处理它
public static int Max(params int[] a)
{
return a.Max();
}
或沿着这些方向的东西
然后你会像
一样使用它var largestNumber = Max(1,2,3,4,5);
或
Max(ep.X,ep.Y,ep.Z) == Max(e.X,e.Y,e.Z)
答案 2 :(得分:0)
如果你真的想摆脱问号和冒号,你可以试试这个:
var points = from g in groupedData
from ep in g
select ep).OrderByDescending(x => x.GetType().GetProperties().Max(y => y.GetValue(x,null))).FirstOrDefault());
说明:
这基本上使用反射来获取项目中的属性列表(在您的情况下为X,Y和Z),然后根据属性之间的最大值对项目进行排序。然后从列表中选择第一个应该是具有最高属性的项目。
这方面的好处是,如果你决定增加一个属性(比方说K),你就不必改变任何东西。 (想象一下,如果你想在问号和冒号的比较中添加K,你必须要做什么。)
注意:强> 如果您在班级中有其他不想在比较中使用的属性,则可以通过
添加替换x.GetType().GetProperties()
x.GetType().GetProperties().Select(prop =>prop.PropertyType.Name.Equals("Int32"))
这只会得到整数属性。仅在您需要时使用或忽略。
希望有所帮助