Linq Take()问题

时间:2009-09-01 18:52:41

标签: linq linq-to-sql

我想过滤我的结果,只拍摄X条记录。我想知道Take()是如何工作的?

在这个网站上我发现:http://www.hookedonlinq.com/TakeOperator.ashx

它表示Take()“如果source为null,则抛出ArgumentNullException。”所以我该怎么做?我不能保证每次我做一个Take()我会在那个表中有一些记录。

所以我首先要做一个计数?然后再做一个查询以确保有一些记录要抓?

如果我有Take(2)但只有1条记录会抛出同样的异常会发生什么呢?

4 个答案:

答案 0 :(得分:46)

空引用和空集合之间存在差异。可以在空集合上调用Take。并且参数指定了要采用的最大数量,因此指定多于集合中的项目也可以。

我建议您参考MSDN获取此类精确的详细信息。

对于Linq to Objects:http://msdn.microsoft.com/en-us/library/bb503062.aspx

对于数据库链接:http://msdn.microsoft.com/en-us/library/bb300906.aspx

答案 1 :(得分:11)

只有在针对对象源执行此操作时才会出现此空引用异常,例如:

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

当您使用Linq to SQL时,它将返回您的数据的EMPTY枚举器,而不是空引用。同样地,如果你试图获得超过可用数量的东西,它只会占用可用的金额。我在某些情况下使用这种方法来分页数据,当我要求提供比列表更多的记录时,我肯定会使用这种方法。

答案 2 :(得分:2)

如果调用它的对象为null,则通过异常。有可能你没有空对象,没有或没有更少的行是不一样的(我相信你理解语义)。

如果您正在使用Linq to SQL上下文并以

的方式查询
Context.MyTable.Where(x => x.ID > 0).Take(2);  

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

答案 3 :(得分:0)

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

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