EF 별개 (iequalitycomparer) 오류
-
06-07-2019 - |
문제
좋은 아침이에요!
주어진:
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()
, 그러나 분명히 작동하지 않습니다.)
제휴하지 않습니다 StackOverflow