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;

Linq到SQL中的多个值比较

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"))

这只会得到整数属性。仅在需要时使用,否则忽略。

希望有帮助