Ошибка EF Distinct (IEqualityComparer)

Доброе утро!

Дано:

<code>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();
    }
}
</code>

Это скомпилируется, но во время выполнения я получуLinq to Entity could not translate Comparer-Exception.
Какие-либо предложения?

Ответы на вопрос(1)

Решение Вопроса

вам необходимо выполнить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();

Это даст вам первую сущность, с которой встречается каждый идентификатор (при условии, что мой запрос-фу не подведет меня). Это в основном то, что Distinct делает в любом случае, но все это в базе данных.

(Примечание для будущих читателей: вызовFirst() имеет больше смысла, чемFirstOrDefault(), но, видимо, это не работает.)

 Andreas Niedermair18 июн. 2009 г., 08:14
Спасибо! Это выглядит очень правдоподобно для меня, поскольку вы работаете с группой на IQueryable & lt; T & gt ;. Я попробую это позже! PS: Да, вы правильно поняли «отличительное условие» :)
 18 июн. 2009 г., 23:00
Крысы. Вы пытались использовать FirstOrDefault? Если это сработает, я исправлю свой ответ :)
 Andreas Niedermair18 июн. 2009 г., 22:13
System.NotSupportedException: метод «первый»; может использоваться только в качестве окончательной операции запроса. Попробуйте использовать метод «FirstOrDefault» в этом случае вместо этого.
 18 июн. 2009 г., 08:10
Смотрите мое редактирование - используйте группировку, и вы получите желаемое поведение. Было бы хорошо иметь & quot; DistinctBy & quot; в рамках (и обрабатываются EF и т. д.), но я думаю, что сгруппированная версия будет делать то, что вы хотите.
 Andreas Niedermair18 июн. 2009 г., 08:02
Есть ли шанс сделать это не в .NET-Layer? Как-нибудь сказать EF-вызову сделать это в SQL?

Ваш ответ на вопрос