【问题标题】:SQL ROW_NUMBER() in LINQ Query SyntaxLINQ 查询语法中的 SQL ROW_NUMBER()
【发布时间】:2021-04-05 23:08:22
【问题描述】:

我有这个查询,我希望用 Linq 替换它作为查询语法:

select 
    ii.Id, ii.Name as Supplier,
    qi.Price1, qi.Price2, qi.Price3,
    case when qi.price1 is null then NULL else ROW_NUMBER() OVER(ORDER BY isNull(qi.price1,1000000) ASC) end AS Price1Order,    
    case when qi.price2 is null then NULL else ROW_NUMBER() OVER(ORDER BY isNull(qi.price2,1000000) ASC) end AS Price2Order,    
    case when qi.price3 is null then NULL else ROW_NUMBER() OVER(ORDER BY isNull(qi.price3,1000000) ASC) end AS Price3Order
From dbo.InquiryItems ii
left join dbo.quoteItems qi on ii.Id = qi.QuoteItem_InquiryItem

SQL-查询结果:

Id      Supplier        Price1  Price2  Price3  Price1Order Price2Order Price3Order
1655    Supplier 2      80.00   NULL    40.00   3           NULL        1
1656    Supplier 4      65.00   30.00   42.00   2           1           2
1662    Supplier 1      15.00   35.00   43.00   1           2           3
1670    Supplier 3      250.00  NULL    NULL    4           NULL        NULL

在 C# 中,我需要将此查询作为 IQueryable 对象。我必须过滤不同部分(一个或多个)的查询,然后按供应商 (IdAccount) 对它进行分组并对价格求和。这个价格我必须排名。

return colQuoteItem = from vQuote in this.vQuoteItemOverviews
    where vQuote.IdConstructionStageId == ConstructionStageId                               
    group vQuote by new
    {
        vQuote.IdAccount
    } into g                                                              
    select new vQuoteItemOverviewSum
    {
        Id = g.Max(x => x.Id),                                   
        Price1Order = null,  //Here I need the ROW_NUMBER like in the SQL-Syntax
        Price2Order = null,  //Here I need the ROW_NUMBER like in the SQL-Syntax
        Price3Order = null,  //Here I need the ROW_NUMBER like in the SQL-Syntax
        price1 = g.Sum(x => x.price1),
        price2 = g.Sum(x => x.price2),
        price3 = g.Sum(x => x.price3),                                   
    }
    ;

【问题讨论】:

标签: c# sql-server linq


【解决方案1】:

这行得通吗?

var qi1 = (from qi in quoteItems orderby qi.price1 select new {qi.QuoteItem_InquiryItem}).AsEnumerable().Select((i, index) => new {i.QuoteItem_InquiryItem, Rank = index + 1});

var qi2 = (from qi in quoteItems orderby qi.price2 select new {qi.QuoteItem_InquiryItem}).AsEnumerable().Select((i, index) => new {i.QuoteItem_InquiryItem, Rank = index + 1});

var qi3 = (from qi in quoteItems orderby qi.price3 select new {qi.QuoteItem_InquiryItem}).AsEnumerable().Select((i, index) => new {i.QuoteItem_InquiryItem, Rank = index + 1});


return colQuoteItem = from vQuote in this.vQuoteItemOverviews.AsEnumerable()
    where vQuote.IdConstructionStageId == ConstructionStageId                               
    group vQuote by new
    {
        vQuote.IdAccount
    } into g                                                              
    select new vQuoteItemOverviewSum
    {
        Id = g.Max(x => x.Id),                                   
        Price1Order = qi1.FirstOrDefault(_ => _.IdConstructionStageId == x.Id)?.Rank,  //Here i need the ROW_NUMBER like in the SQL-Syntax
        Price2Order = qi2.FirstOrDefault(_ => _.IdConstructionStageId == x.Id)?.Rank,  //Here i need the ROW_NUMBER like in the SQL-Syntax
        Price3Order = qi3.FirstOrDefault(_ => _.IdConstructionStageId == x.Id)?.Rank,  //Here i need the ROW_NUMBER like in the SQL-Syntax
        price1 = g.Sum(x => x.price1),
        price2 = g.Sum(x => x.price2),
        price3 = g.Sum(x => x.price3),                                   
    }
    ;

【讨论】:

  • 感谢您的回答,它看起来很好,但也不起作用。我收到此错误:您无法创建“匿名类型”类型的常量值。在这种情况下,仅支持原始类型和枚举类型。谢谢。
  • @HGRUser 我不确定它是否能正常工作,但错误来自哪一行?
  • @HGRUser 听起来如果您为{i.QuoteItem_InquiryItem, Rank = index + 1} 创建一个类并将var qi1 = 替换为IEnumerable<myClass> qi1 = new myClass() {Item = i.QuoteItem_InquiryItem, Rank = index + 1} 可能会消除错误。
  • 我从_ => _.IdConstructionStageId == x.Id 行得到的错误。使用该类,我得到相同的异常->仅支持原始类型和枚举类型。
  • @HGRUser _ => _.IdConstructionStageId == x.Id 不正确,那里没有定义 x,我认为应该是 _ => _.IdConstructionStageId == g.Max(x => x.Id)。只是试图获取项目的 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多