【问题标题】:Multiple value comparisons in Linq to SQLLinq to SQL 中的多值比较
【发布时间】:2013-02-14 21:49:46
【问题描述】:

有没有人用 linq to entity 有更简洁的方法?

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

【问题讨论】:

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


【解决方案1】:
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 虽然向我介绍了“让”。
  • 是的,它也可以使用 'Enumerable.Max()' 作为 where 子句,我认为这可以让正在发生的事情更加明显。一方面,尽管这确实意味着这个问题至少部分由 mellamokbTheWise 的重复问题回答。
【解决方案2】:

我会创建一个扩展方法来处理它

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)

【讨论】:

  • 这里说的不是Linq2Objects,而是Linq2Sql或者Linq2Entities(Void应该更准确些)。扩展方法仅适用于 Linq2Object。
  • 对缺乏精确性表示歉意,但这是针对实体的
【解决方案3】:

如果你真的想去掉问号和冒号,你可以试试这个:

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() by

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

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

希望有所帮助

【讨论】:

  • 我不认为这比原始示例更具可读性。
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多