我正在尝试使用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移到末尾,否则每次都会从数据库中检索所有项目,并且OrderByDescendingTake然后实际上在内存中的对象的List<>上运行,而不是将其作为数据库查询来执行我认为这是意料之外的。

关于第二个问题,如果您执行Take(50),但是只有10个条目可用。这可能取决于您的数据库提供程序,但是根据我的经验,它们往往足够聪明,不会引发异常,并且只会为您提供任意数量的可用项目。 (我建议您进行快速测试,以确保适合您的具体情况)

关于c# - LINQ中的.Take方法是否有通配符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16899792/

10-17 01:48