在Linq的Row_number(由yyy分区)?

Com*_*umb 3 c# linq asp.net-mvc

我对LINQ很新,我最初使用它的一个尝试必须超级复杂!

我试图在这个Stack Over问题中调整已接受的答案.

我这样写了:

using (var ctx = new MyEntities())
        {
            var q = ctx.tblPrices.OrderByDescending(x => x.Cost)
                .GroupBy(x => x.ItemID)
                .Select(g => new {g, count = g.Count()})
                .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new {j.WebPrice, j.PriceID, j.ItemID}));

            foreach (var i in q)
            {
                sb.AppendFormat("Id = {0}, Name = {1}, ItemId = {2}<hr/>", i.WebPrice, i.PriceID, i.ItemID);
            }

        }
Run Code Online (Sandbox Code Playgroud)

基本上,我想从不同供应商那里退回相同商品的最便宜价格.

但是,当我运行项目时,我得到以下很长的错误消息,我不知道它意味着什么.但它看起来很严重!

LINQ to Entities无法识别方法'System.Collections.Generic.IEnumerable 1[<>f__AnonymousType53 [System.Nullable 1[System.Decimal], System.Int32,System.Int32]] Zip[tblPrice,Int32,<>f__AnonymousType53](System.Collections.Generic.IEnumerable 1[MyProjectMVC.Models.tblPrice], System.Collections.Generic.IEnumerable1 [System.Int32],System.Func 3[MyProjectMVC.Models.tblPrice,System.Int32, <>f__AnonymousType53 [System.Nullable`1 [System .Decimal],System.Int32,System.Int32]])'方法,并且此方法无法转换为商店表达式.

任何帮助将不胜感激.

teo*_*kot 5

@Adil Mammadov对,因为LINQ无法将方法转换为SQL.

为避免此问题,您有几种解决方案:

  1. 指定MS SQL计算列,然后使用LINQ获取它
  2. 将您的ows翻译写入SQL
  3. @Matt Burland如何说 - 得到结果然后处理它

我想在你的情况下问题可以像这样解决:

var q = ctx.tblPrices.OrderByDescending(x => x.Cost)
                .ToList()
                .GroupBy(x => x.ItemID)
                .Select(g => new {g, count = g.Count()})
                .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new {j.WebPrice, j.PriceID, j.ItemID}));
Run Code Online (Sandbox Code Playgroud)

或者甚至像这样:

var q = ctx.tblPrices.OrderByDescending(x => x.Cost)
                .GroupBy(x => x.ItemID)
                .Select(g => new {g, count = g.Count()})
                .ToList()
                .SelectMany(t => t.g.Select(b => b).Zip(Enumerable.Range(1, t.count), (j, i) => new {j.WebPrice, j.PriceID, j.ItemID}));
Run Code Online (Sandbox Code Playgroud)

您也可以查看我的答案.