2013-10-17 2 views
0

내 질문에이 솔루션을 제공했습니다 ... 매우 흥미로운 것 같습니다. 내가 노력하고 LINQ 이해하는 학습.이 구현하는 동안이 오류가 발생합니다. 나는 여기에 잘못 가고있는 것을 모릅니다 ... 전문가의 조언을 구합니다.IEqualityComparer 오류 <T>

public class CategotiesEqualityComparer : IEqualityComparer<ac_Categories> 
{ 
    public bool Equals(ac_Categories x, ac_Categories y) 
    { 
     return x.ThumbnailAltText.Trim() == y.ThumbnailAltText.Trim(); 
    } 

    public int GetHashCode(ac_Categories obj) 
    { 
     return obj.ThumbnailAltText.Trim().GetHashCode(); 
    } 
} 

var catlist = _db.ac_Categories 
.Where(c => c.VisibilityId == 0 && c.ThumbnailAltText != null 
    && (!c.ThumbnailAltText.StartsWith("gifts/") 
    && !c.ThumbnailAltText.StartsWith("email/") 
    && !c.ThumbnailAltText.StartsWith("news/") 
    && !c.ThumbnailAltText.StartsWith("promotions/") 
    && !c.ThumbnailAltText.StartsWith("the-knowledge/"))) 
    .Distinct(new CategotiesEqualityComparer()).ToList(); 

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

참고 :

나는 데이터베이스 첫 번째 방법을 이용하고 있고 ac_Categories하면 해당를 사용하여 만들어집니다 ...

+3

귀하의 질문에 이미 답변되었습니다 : http://stackoverflow.com/a/1011014/222163 –

답변

4

당신은 EF 쿼리를 호출 내로 IEqualityComparer 비교자를 전달할 수 없습니다 또는 대부분 IQueryable 컬렉션입니다. IQueryable은 표현 트리가 기본 쿼리 (예 : EF가있는 SQL)로 변환됩니다. 따라서 SQL에서 코드를 실행할 수 없습니다.

정상적인 Distinct() 호출은 중복 된 동일한 레코드를 걸러 내고 SQL을 고유하게 수행하기 때문에 호출이 잘 작동합니다. 평등 비교자를 적용하려면 데이터를 메모리로 가져와 고유 한 값을 적용해야합니다.

+1

예 ... 알아 들었어 ... 나는 AsEnumerable()을 사용해야합니다. –

+2

네,하지만이 사실을 알고 있어야합니다. 오직 SQL에서 WHERE를 실행 시키면, distinct가 메모리에서 수행 될 것입니다. 그룹별로 데이터 집합의 크기에 따라 더 빠를 수도 있습니다. –

관련 문제