LINQ OrderBy 和 Where 结合

Posted

技术标签:

【中文标题】LINQ OrderBy 和 Where 结合【英文标题】:LINQ OrderBy and Where combined 【发布时间】:2017-06-12 04:47:41 【问题描述】:

我试图避免在以下情况下对DistanceTo 方法进行多次检查:

public IEnumerable<Object> NearbyObjects => Objects.Where(o => a.DistanceTo(o) < 10).OrderBy(o => a.DistanceTo(o));

public IEnumerable<Object> NearbyObjects => Objects.OrderBy(o => a.DistanceTo(o)).TakeWhile(o => a.DistanceTo(o) < 10);

无论如何,我必须使用两次DistanceTo 方法。可以在 LINQ 中避免这种情况吗?

【问题讨论】:

【参考方案1】:

您可以在 linq 查询语法中使用 let 语句,如下所示:

public IEnumerable<Object> NearbyObjects =>
   from o in Objects
   let distanceTo = a.DistanceTo(o) 
   where distanceTo < 10
   orderby distanceTo 
   select o;

如果你想使用方法语法,你将不得不临时投影到一个匿名类型

public IEnumerable<Object> NearbyObjects =>
   Objects.Select(o => new  o, distanceTo = a.DistanceTo(o) )
          .Where(o => o.distanceTo < 10)
          .OrderBy(o => o.distanceTo)
          .Select(o => o.o);

【讨论】:

以上是关于LINQ OrderBy 和 Where 结合的主要内容,如果未能解决你的问题,请参考以下文章

C# LINQ 详解 From Where Select Group Into OrderBy Let Join

OrderBy 将 Dynamic Linq 与 Relation 结合使用

Linq to Entities 中的动态 where 子句 (OR)

带有 lambda 表达式的 LINQ where 子句具有 OR 子句和返回不完整结果的空值

如何在 linq 查询 c# 中的 WHERE 语句后嵌入动态 OR 条件

System.Linq.Dynamic的使用