C# Linq到SQL中的多值比较
有没有人能用LINQtoEntities更整洁地实现这一点 我试图获取每组中X、Y或Z值最高的项目,例如Max(X、Y、Z) PS:Linq2SQL还是LINQ2实体?因为你标记了“EF” 编辑:我刚刚成功地测试了这一点:C# Linq到SQL中的多值比较,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,有没有人能用LINQtoEntities更整洁地实现这一点 我试图获取每组中X、Y或Z值最高的项目,例如Max(X、Y、Z) PS:Linq2SQL还是LINQ2实体?因为你标记了“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
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);
或
如果您真的想去掉问号和冒号,可以尝试以下方法:
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,你必须做什么)
注意:
如果您的类中有其他不想在比较中使用的属性,则可以添加replacex.GetType().GetProperties()
by
x.GetType().GetProperties().Select(prop =>prop.PropertyType.Name.Equals("Int32"))
这将只获取整数属性。仅在需要时使用,否则忽略
希望这有助于可能重复@mellamokbTheWise:不同意,我们需要一个与Linq2Sql或LINQ2实体兼容的解决方案!这里不是关于LINQ2对象,而是关于Linq2Sql或Linq2Entities(Void应该更精确)。扩展方法只在Linq2Object中起作用。对于缺乏精确性表示歉意,但这是为ling to Entities设计的。我希望去掉所有的问号和冒号+尽管我向大家介绍了“let”。是的,对where子句使用“Enumerable.Max()”也很有效,我认为这会使发生的事情更加明显。一方面,虽然这确实意味着这个问题至少部分得到了梅拉莫克德修斯重复问题的回答,但我认为这并没有比原来的例子更具可读性。
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());
x.GetType().GetProperties().Select(prop =>prop.PropertyType.Name.Equals("Int32"))