LINQ查询以选择前五个

270

我有一个LINQ查询:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

我该如何修改这个查询以从数据库中仅选择五个结果?


4
请告诉我您希望翻译的原文是什么,以便我可以为您提供准确的翻译。 - Soner from The Ottoman Empire
如果你想要高效率,就使用SQL和Dapper。 - niico
6个回答

500
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

8
+1,但是啊,用括号包裹多行表达式,然后再对整个表达式解引用,这种写法真的让我感觉很不爽。 - Doctor Jones
11
似乎这会从数据库中获取与等式条件匹配的结果,并且只有在从数据库中取出这些结果之后,才在应用程序中应用take(5)限制。是否有一种方法可以从数据库中字面上只取前5行? - JM Hicks
7
@JMHicks并不完全正确。Take(5)命令只是向IQueryable添加另一个条件,直到对其进行枚举之前都不会执行。但是,有些LINQ提供程序可能不支持Take操作。 - Bruno Brant
1
@JMHicks -- 这不是 Linq 的工作方式... Linq 是延迟执行的。 - Hogan
2
根据 https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.take?view=net-6.0 的文档,此构造不会先枚举整个集合。引用:Take 是通过使用延迟执行来实现的。立即返回的值是一个对象,它存储执行操作所需的所有信息。由此方法表示的查询直到通过直接调用其 GetEnumerator 方法或使用 foreach 枚举该对象时才会执行。 - Christopher Hamkins
显示剩余4条评论

44
解决方案:
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

27

也可以使用基于 lambda 的 LINQ 方法来实现此目的;

var list = ctn.Items
             .Where(t => t.DeliverySelection == true &&
                    t.Delivery.SentForDelivery == null)
             .OrderBy(t => t.Delivery.SubmissionDate)
             .Take(5);

12

这也可以使用LINQ 流畅语法来实现:

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

请注意,此 LINQ 语句中出现的每个方法(WhereOrderByTake)都将 lambda 表达式 作为参数。还请注意,Enumerable.Take 的文档以以下内容开头:

从序列的开头返回指定数量的连续元素。

(这比 答案 提供的 Ajni 稍微更详细一些。)


8

额外信息

有时需要将一个模型绑定到视图模型中,并出现类型转换错误。在这种情况下,应使用ToList()方法。

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();

2

我在想你可能对于 SQL 脚本中的序列 From->Where->Select 感到不太熟悉,但实际上它的顺序是Select->From->Where

但是你可能不知道,在 SQL 引擎内部,它也是按照From->Where->Select 的顺序进行解析。为了验证它,你可以尝试一个简单的脚本:

select id as i from table where i=3

但这样是行不通的。原因是引擎会在解析选择之前解析条件,所以它不会知道条件中的别名i。为了使其正常工作,您可以尝试

select * from (select id as i from table) as t where i = 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接