2014-12-12 1 views
3

저는 LINQ에 매우 익숙하며 사용하기에 처음 시도한 시도 중 하나가 복잡해야했습니다!Linq에서 Row_number (파티션 by yyy)?

나는이 Stack Over question에 수락 된 대답을 적용하려고합니다.

나는 따라서를 작성했습니다 :

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); 
      } 

     } 

는 기본적으로, 다른 업체에서 같은 항목에 대해 가장 저렴한 가격을 반환합니다.

그러나 프로젝트를 실행할 때 다음과 같은 매우 긴 오류 메시지가 표시되며 의미가 무엇인지 알 수 없습니다. 그러나 그것은 꽤 심각한 것처럼 보인다! 엔티티가

LINQ있어서 'System.Collections.Generic.IEnumerable 1[<>f__AnonymousType5 3 선택 System.Nullable 1[System.Decimal], System.Int32,System.Int32]] Zip[tblPrice,Int32,<>f__AnonymousType5 3]을 인식하지 못한다 (System.Collections.Generic.IEnumerable 1[MyProjectMVC.Models.tblPrice], System.Collections.Generic.IEnumerable 1 선택 System.Int32, 시스템 .Func 3[MyProjectMVC.Models.tblPrice,System.Int32, <>f__AnonymousType5 3 [System.Nullable`1 [System.Decimal], System.Int32, System.Int32]]) ' 메서드이며이 메서드는 저장소 식으로 변환 할 수 없습니다.

도움을 주시면 감사하겠습니다.

+2

Enumerable.Range (1, t.count)에 문제가있을 수 있습니까? LINQ to SQL –

+1

당신의 대답은 다음과 같습니다 :'메소드는 스토어 식으로 변환 될 수 없습니다 .' Linq to SQL은 쿼리의 일부를 SQL 명령으로 변환 할 수 없습니다. 먼저 데이터베이스에서 결과를 얻어야 할 수도 있습니다 (단순한'.ToList '가 보통 트릭을합니다). –

+0

다른 공급 업체의 가장 저렴한 가격이라면 가장 저렴한 가격을 나타내는 'WebPrice' 및'PriceID'와 함께 고유 한 'ItemID'에 대해 하나의 항목이 결과에 표시된다는 의미입니까? – Rhumborl

답변

4

@ Adil Mammadov 맞아, LINQ는 메서드를 SQL로 변환 할 수 없기 때문에 가능합니다.

여러 솔루션이이 문제를 방지하려면 다음

  1. MS SQL 계산 열을 지정하고 단지 SQL로 LINQ
  2. 와 OWS 번역을 쓰기 잡아
  3. @ 매트 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})); 

심지어 같은3210 :

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})); 

또한 this my answer를 확인할 수 있습니다.

+1

ToList는 일반적으로 이러한 문제를 해결하는 가장 쉬운 방법입니다. 또한 ToList를 사용하면 DataReader가 닫히므로 웹 응용 프로그램에서 Linq를 실행할 때 잠긴 dataReader 문제가 발생하지 않습니다. –