3

有没有人有一个更整洁的方式来使用 linq to entity?

我正在尝试获取每个组中具有最高 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;
4

3 回答 3

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;

你确认它适用于你的情况吗?

于 2013-02-28T16:13:15.320 回答
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)
于 2013-02-28T16:13:49.067 回答
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"))

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

希望有帮助

于 2013-02-28T17:22:01.940 回答