如何将ROW_NUMBER添加到LINQ查询或实体?

Who*_*mmy 23 linq asp.net entity-framework

我被这个简单的数据问题困扰了.

我正在使用Entity框架并拥有一个产品数据库.我的结果页面返回这些产品的分页列表.现在我的结果按每个产品的销售数量排序,所以我的代码如下所示:

return Products.OrderByDescending(u => u.Sales.Count());
Run Code Online (Sandbox Code Playgroud)

这将返回我的实体的IQueryable数据集,按销售数量排序.

我希望我的结果页面显示每个产品的排名(在数据集中).我的结果应如下所示:

Page #1
1. Bananas
2. Apples
3. Coffee

Page #2
4. Cookies
5. Ice Cream
6. Lettuce
Run Code Online (Sandbox Code Playgroud)

我希望我只想在结果中使用SQL ROW_NUMBER变量添加一列...但我不知道如何将此列添加到我的结果数据表中.

我的结果页面确实包含一个foreach循环,但由于我使用的是分页集,我猜测使用该数字来伪造排名数字不是最好的方法.

所以我的问题是,在这种情况下,如何在查询结果中添加ROW_NUMBER列?

Cra*_*ntz 30

使用Select索引重载:

var start = page * rowsPerPage;
Products.OrderByDescending(u => u.Sales.Count())
    .Skip(start)
    .Take(rowsPerPage)
    .AsEnumerable()
    .Select((u, index) => new { Product = u, Index = index + start });
Run Code Online (Sandbox Code Playgroud)

  • 建议在明确要求sql函数(ROW_NUMBER)时使用AsEnumerable()是一个完整的非答案. (11认同)
  • 太糟糕了,Linq to Entities提供程序不使用sql"ROW_NUMBER()"internall来防止你必须使用.AsEnuerable()以及Select语句的这个索引重载,这在某些情况下可能会导致不必要的大从数据存储中检索结果集. (6认同)
  • 您不必使用匿名类型.创建一个非匿名类型,并在需要时使用它.这只是一个例子. (3认同)

Nic*_*rdi 0

尝试这个

var x = Products.OrderByDecending(u => u.Sales.Count());
var y = x.ToList();

for(int i = 0; i < y.Count; i++) {
    int myNumber = i; // this is your order number
}
Run Code Online (Sandbox Code Playgroud)

只要列表保持相同的顺序,除非销售数量发生变化,否则就应该发生这种情况。您可以获得准确的计数;

还有这种做法。

var page = 2;
var count = 10;
var startIndex = page * count;

var x = Products.OrderByDecending(u => u.Sales.Count());
var y = x.Skip(startIndex).Take(count);
Run Code Online (Sandbox Code Playgroud)

这给出了页面的起始索引,此外还提供了要在页面上显示的一小组销售数据。您只需在网站上的 startIndex 处开始计数即可。