LINQ中的.Take方法是否有通配符?

Bry*_*can 5 c# linq entity-framework

我正在尝试使用LINQ创建一个方法,该方法将从数据库中获取X ammount产品,因此我使用.TAKE方法.

问题是,在我需要采取所有产品的情况下,是否有一个我可以提供的通配符.TAKE或其他一些方法可以为我带来数据库中的所有产品?

此外,如果我执行.TAKE(50)并且数据库中只有10个产品会发生什么?我的代码看起来像:

var ratingsToPick = context.RatingAndProducts
    .ToList()
    .OrderByDescending(c => c.WeightedRating)
    .Take(pAmmount);
Run Code Online (Sandbox Code Playgroud)

Chr*_*air 6

您可以根据您的标志将其分隔为单独的呼叫:

IEnumerable<RatingAndProducts> ratingsToPick = context.RatingAndProducts
    .OrderByDescending(c => c.WeightedRating);

if (!takeAll)
    ratingsToPick = ratingsToPick.Take(pAmmount);

var results = ratingsToPick.ToList();
Run Code Online (Sandbox Code Playgroud)

如果你不包括Take,那么它将简单地采取一切.

请注意,您可能需要键入原始查询,IEnumerable<MyType>因为它OrderByDescending返回IOrderedEnumerable并且不会从Take调用中重新分配.(或者你可以根据你的实际代码简单地解决这个问题)

此外,作为@ Rene147指出的那样,你应该将你ToList到底否则会检索所有从数据库中的项目,每次和OrderByDescendingTake随后实际上在运行List<>内存中的对象执行它作为一个数据库查询,我认为是意外的.


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

  • 我的linq2SQL是新手级别,我只做Linq2Objects,但不是`ToList()`使这个Linq2Objects查询并且不再依赖于数据库提供者?编辑:BAH,那两次,我问你一些事情,当你点击"添加评论"时,你立即编辑你的问题澄清它. (2认同)