문제

좋은 아침이에요!

주어진:

public class FooClass
{
    public void FooMethod()
    {
        using (var myEntity = new MyEntity)
        {
            var result = myEntity.MyDomainEntity.Where(myDomainEntity => myDomainEntity.MySpecialID > default(int)).Distinct(new FooComparer);
        }
    }

}

public class FooComparer : IEqualityComparer<MyEntity.MyDomainEntity>
{
    public bool Equals(MyEntity.MyDomainEntity x, MyEntity.MyDomainEntity y)
    {
        return x.MySpecialID == y.MySpecialID;
    }

    public int GetHashCode(MyEntity.MyDomainEntity obj)
    {
        return obj.MySpecialID.GetHashCode();
    }
}

이것은 컴파일되지만 런타임에 Linq to Entity could not translate Comparer-예외.
제안이 있습니까?

도움이 되었습니까?

해결책

자신의 비교를 제공하는 경우 Distinct .NET 코드로 호출하십시오. 그런 일이 있는지 확인하려면 사용하십시오 AsEnumerable 회전합니다 IQueryable<T> ~ 안으로 IEnumerable<T>:

var result = myEntity.MyDomainEntity
        .Where(myDomainEntity => myDomainEntity.MySpecialID > default(int))
        .AsEnumerable()
        .Distinct(new FooComparer());

물론 그 시점에서 데이터베이스에서 더 많은 데이터를 가져 오게됩니다. 대안은 대신 데이터를 그룹화하는 것입니다.

var result = from entity in myEntity.MyDomainEntity
             where entity.MySpecialID > 0
             group entity by entity.MySpecialID into groups
             select groups.FirstOrDefault();

이를 통해 각 ID에서 발생하는 첫 번째 엔터티가 발생할 수 있습니다 (내 쿼리 FU가 실패하지 않는다고 가정합니다). 그것은 기본적으로 어쨌든 뚜렷한 일이지만 데이터베이스에 있습니다.

(미래 독자들에게 주석 : 전화 First() 보다 더 의미가 있습니다 FirstOrDefault(), 그러나 분명히 작동하지 않습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top