您可以根据您的标志将其分离为单独的调用:
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 个条目可用。这可能取决于您的数据库提供商,但根据我的经验,它们往往足够聪明,不会抛出异常,并且只会为您提供任何数量的可用项目。(我建议您进行快速测试以确保您的具体情况)