2016-09-15 20 views
5

Tôi có Mà truy vấn này, tôi muốn thay thế với LINQ như cú pháp truy vấn:SQL ROW_NUMBER() trong LINQ Query Cú pháp

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 Query Result:

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 

Trong C# tôi cần truy vấn này như một đối tượng IQueryable. Tôi phải lọc truy vấn cho các phần khác nhau (một hoặc nhiều) và sau đó nhóm nó theo Nhà cung cấp (IdAccount) và SUM giá. Giá này tôi phải xếp hạng.

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ảm ơn.

+1

Bản sao có thể có của [Row \ _number over (Partition by xxx) in LINq?] (Http://stackoverflow.com/questions/9980568/row-number-over-partition-by-xxx-in- linq) – captainsac

+1

chút phức tạp, vì bạn có 3 trường muốn có row_number. Bạn có thể thử đề xuất trong bài đăng này trước tiên: http://stackoverflow.com/questions/365086/how-to-project-a-line-number-into-linq-query-results/365127#365127 – Prisoner

Trả lời

1

Điều này có hiệu quả không?

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),         
    } 
    ; 
+0

Cảm ơn câu trả lời của bạn, có vẻ rất tốt nhưng nó cũng không hoạt động. Tôi gặp lỗi này: Bạn không thể tạo giá trị liên tục của loại 'Loại ẩn danh'. Trong bối cảnh này, chỉ có các kiểu nguyên thủy và các kiểu liệt kê mới được hỗ trợ. Cảm ơn. –

+0

@HGRUser Tôi không chắc liệu nó có hoạt động hay không nhưng lỗi nào xuất hiện? – artm

+0

@HGRUser Cũng có vẻ như nếu bạn tạo một lớp cho '{i.QuoteItem_InquiryItem, Rank = index + 1}' và thay thế 'var qi1 =' bằng 'IEnumerable qi1 =' và 'new myClass() {Item = i .QuoteItem_InquiryItem, Rank = index + 1} 'có thể loại bỏ lỗi. – artm

Các vấn đề liên quan