2013-02-28 38 views
3

有没有人用linq对实体进行这种整理?在Linq to SQL中进行多值比较

我试图让每个组中具有最高的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; 
+0

可能重复[在C#中有没有发现3号的最大的方法?(http://stackoverflow.com/questions/6800838/in-c-sharp-is-有一种方法可以找到最多3个数字) – mellamokb 2013-02-28 16:07:30

+0

@mellamokbTheWise:不同意,我们需要一个兼容Linq2Sql或Linq2Entities的解决方案! – JYL 2013-02-28 16:14:56

回答

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

我希望摆脱所有的问号和冒号。 +1虽然为我介绍'让'。 – Void 2013-02-28 16:33:25

+0

@Void:也许更好的解决方案,请参阅我的编辑:) – JYL 2013-02-28 16:58:10

+0

是的,它的作品,它也可以使用'Enumerable.Max()'的where子句,我认为它更明显发生了什么。一方面,尽管这确实意味着这个问题至少部分得到了mellamokbTheWise的重复问题的回答。 – Void 2013-03-01 08:48:13

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) 
+0

这不是关于Linq2Objects的,而是Linq2Sql或Linq2Entities(Void应该更精确)。扩展方法仅适用于Linq2Object。 – JYL 2013-02-28 16:22:50

+0

对精度不高的道歉,但这是针对实体 – Void 2013-02-28 16:28:11

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)然后根据属性之间的Max命令项目。然后从列表中选择第一个应该是具有最高属性的项目。

这样做的好处是,如果你决定增加一个属性(让我们说K),你不需要改变任何东西。 (如果你想将K与问号和冒号进行比较,则可以选择你想做的事情)。

注: 如果你在你的类的其他属性,你不希望在比较中使用,你可以新增

x.GetType().GetProperties().Select(prop =>prop.PropertyType.Name.Equals("Int32")) 

这取代x.GetType().GetProperties()只会得到整数性能。仅在需要时才使用,否则忽略。

希望帮助的

+0

不适用于Linq2Entities。仅适用于Lind2bject。 – JYL 2013-02-28 21:50:42

+0

我不认为这比原来的例子更可读。 – Void 2013-03-01 08:18:18