我正在尝试使用LINQ创建一种方法,该方法将使DB占用X数量的产品,因此我正在使用.TAKE方法。
问题是,在某些情况下,我需要拿走所有产品,那么是否可以给.TAKE加上通配符,或者使用其他方法将所有产品带入数据库?
另外,如果我执行.TAKE(50)并且数据库中只有10种产品,会发生什么?
我的代码看起来像:
var ratingsToPick = context.RatingAndProducts
.ToList()
.OrderByDescending(c => c.WeightedRating)
.Take(pAmmount);
最佳答案
您可以根据自己的标志将其分为一个单独的调用:
IEnumerable<RatingAndProducts> ratingsToPick = context.RatingAndProducts
.OrderByDescending(c => c.WeightedRating);
if (!takeAll)
ratingsToPick = ratingsToPick.Take(pAmmount);
var results = ratingsToPick.ToList();
如果您不包括
Take
,那么它将简单地处理所有内容。请注意,您可能需要将原始查询键入为
IEnumerable<MyType>
,因为OrderByDescending
返回IOrderedEnumerable
,因此无法从Take
调用中重新分配。 (或者您可以根据实际代码简单地解决此问题)另外,正如@ Rene147所指出的那样,您应该将
ToList
移到末尾,否则每次都会从数据库中检索所有项目,并且OrderByDescending
和Take
然后实际上在内存中的对象的List<>
上运行,而不是将其作为数据库查询来执行我认为这是意料之外的。关于第二个问题,如果您执行
Take(50)
,但是只有10个条目可用。这可能取决于您的数据库提供程序,但是根据我的经验,它们往往足够聪明,不会引发异常,并且只会为您提供任意数量的可用项目。 (我建议您进行快速测试,以确保适合您的具体情况)关于c# - LINQ中的.Take方法是否有通配符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16899792/