Linq到SQL中的多个值比较
本文关键字:比较 SQL Linq | 更新日期: 2023-09-27 18:01:31
有没有人有一个更整洁的方法来做到这一点与链接到实体?
我试图在每个具有最高X, Y或Z的组中获取项目,例如Max(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;
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 or 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;
我将创建一个扩展方法来处理它
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)
如果你真的想去掉问号和冒号,你可以试试:
var points = from g in groupedData
from ep in g
select ep).OrderByDescending(x => x.GetType().GetProperties().Max(y => y.GetValue(x,null))).FirstOrDefault());
解释:
这基本上使用反射来获取Item中的属性列表(在您的示例中为X, Y和Z),然后根据属性之间的最大值对项目进行排序。然后从列表中选择第一个,它应该是属性最高的项。
积极的一面是,如果你决定增加一个属性(比如K),你不必改变任何东西。(想象一下,如果您还想将K添加到问号和冒号的比较中,您将不得不做什么)。
注意:如果你在你的类中有其他不想在比较中使用的属性,你可以添加替换x.GetType().GetProperties()
为
x.GetType().GetProperties().Select(prop =>prop.PropertyType.Name.Equals("Int32"))
这只会得到整数属性。仅在需要时使用,否则忽略。
希望有帮助