Linq to SQL中的多值比较

时间:2013-02-28 16:01:07

标签: c# linq entity-framework linq-to-entities

有没有人用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;

3 个答案:

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

这只会得到整数属性。仅在您需要时使用或忽略。

希望有所帮助