2012-05-17 3 views
1

나는 몇 시간 동안 Distinct가 내 코드에서 작동하도록 노력 해왔다.EF 4.x DBSet 컨텍스트 및 IEqualityComparer에서 작동하도록 Distinct 목록을 얻으려면 어떻게해야합니까?

EF 4.3, MVC3, 면도기를 사용 중이며 제품 ID 및 이름을 얻으려고 시도합니다. DB에 대해 Sql 쿼리를 실행할 때 괜찮습니다.

SQL 쿼리()는 표준 별개가 작동하지 않는 이유는 그래서

SELECT DISTINCT [ProductId] 
     ,[Product_Name] 
    FROM [dbo].[PRODUCT] 

해당 테이블의 유일한 다른 열은 국가 코드입니다. 나는 그것을라는 곳

여기
public class DistinctProduct : IEqualityComparer<PRODUCT> 
    { 
     public bool Equals(PRODUCT x, PRODUCT y) 
     { 
      return x.ProductId.Equals(y.ProductId); 
     } 

     public int GetHashCode(PRODUCT obj) 
     { 
      return obj.ProductId.GetHashCode(); 
     } 
    } 

은 다음과 같습니다

내가 여기 IEqualityComparer

을 만들만큼 멀리 갔다는 코드입니다.

IEqualityComparer<PRODUCT> customComparer = new DistinctProduct(); 
IEnumerable<PRODUCT> y = db.PRODUCTs.Distinct(customComparer); 

그러나 쳤을 때의 나는 진술 그것의 오류가 그 마지막 줄 ...

LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[MyService.Models.PRODUCT] Distinct[PRODUCT](System.Linq.IQueryable`1[MyService.Models.PRODUCT], System.Collections.Generic.IEqualityComparer`1[MyService.Models.PRODUCT])' method, and this method cannot be translated into a store expression. 

사람이 내가 잘못 뭘하는지 말해 줄래?

감사합니다,

데이비드

답변

2

Entity Framework에서 쿼리를 SQL 쿼리로 변환하려고합니다. 분명히 그것은 IEqualityComparerer를 번역하는 방법을 모른다. 데이터베이스에서 Distinct (클라이언트가 필터링 된 결과 만 가져 오는 경우)를 수행할지 여부를 묻는 질문이나 클라이언트에 모든 데이터를 가져 와서 클라이언트에서 고유 한 데이터를 선택하는 것이 좋습니다. 데이터베이스 측면에서 필터링을 수행하여 앱의 실적을 향상시키고 비교를 위해 다양한 전략을 사용할 수 있기를 원한다면 쿼리 상단에 다른 기준을 만드는 코드를 생각해 낼 수 있습니다. 데이터를 클라이언트로 가져 오는 것이 좋습니다 (데이터가 일 수 있음). 수행 할 수 있어야합니다 (.ToList()가 데이터베이스 쿼리 및 결과 구체화를 트리거 함).

3

방금 ​​다음과 같은 뚜렷한를 사용할 수없는 어떤 이유가 있나요?

var distinctProdcts = (from p in db.PRODUCTs 
         select new { 
          ProductId = p.ProductId, 
          Product_Name = p.ProductName 
         }).Distinct(); 

이렇게하면 고유 한 작업을 수행하기 전에 쿼리에서 국가 코드가 제거됩니다.