LINQ Take(); 如何处理当空或可用记录少于请求的情况? LINQ Take();当数据为空或者可用的记录少于请求的数量时,应如何处理?

35

我想要筛选出X条记录。我想知道Take()是如何工作的?

在这个网站上,我找到了这个链接:http://www.hookedonlinq.com/TakeOperator.ashx

它说Take()“如果源为空,则会抛出ArgumentNullException。”那么我该怎么办呢?我不能保证每次执行Take()时表中都有记录。

所以我需要先进行计数吗?然后再进行另一个查询以确保有一些记录可以获取吗?

此外,如果我使用Take(2)但只有1条记录,它会抛出相同的异常吗?

4个回答

64

有没有办法让它获取所有结果或限制结果数量?比如,只有在特定条件下我想限制结果数量,还是我必须将其拆分(即使用不同的方法)? - chobo2
1
@chobo2:它已经做到了这一点。如果你要求5个项目但只有3个,它会给你所有3个。 - Jon Skeet

14

如果你针对一个对象源(例如:)进行这样的操作,那么就会出现空引用异常:

List<MyObject> myList = null;
myList.Take(5); // this would produce the error, of course

使用 Linq to SQL 时,它会返回您的数据的一个空枚举器,而不是空引用。同样地,如果你试图获取超过可用数量的数据,它只会获取可用数量的数据。我在某些情况下使用这种方法来对数据进行分页,并且当我请求比列表中可用记录数更多的记录时,也经常使用此方法。


1
调用null上的任何方法都会抛出NullReferenceException异常。如果您将Take作为静态方法调用,则会引发ArgumentNullException异常:List<object> list = null; Enumerable.Take(list, 5); - knittl

2

如果调用Take方法的对象为空,则会引发异常。你很可能不会遇到空对象,而没有行或少量行不同(我相信你理解语义)。

如果您正在使用Linq to SQL上下文并以以下方式进行查询

Context.MyTable.Where(x => x.ID > 0).Take(2);  

Where返回零个结果的情况下,您不会遇到空指针异常,因为查询尚未执行,如果只包含1个结果,您最终将只获得1个结果。 Take限制了返回记录的数量。


1
不会出现空异常,因为如果“Where”返回零个结果,则会返回一个非空引用对象,表示空序列。 - Daniel Earwicker

0

在执行Take()之前计算项目数量:

List<string> a = new List<string>();
            int count = a.Count > 12 ? 12 : a.Count;
            a.Take(count);

5
这是不必要的。根据文档:"Take<TSource>会枚举source并返回元素,直到已经返回了count个元素或者source中没有更多元素为止。如果count超过了source中元素的数量,那么将返回source的所有元素。" - Nicholas Flees

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