Entity Framework Сравнение объектов - PullRequest
6 голосов
/ 08 декабря 2011

У меня проблемы со сравнением объектов в Entity Framework 4.0.Пройдя некоторое время по поиску, я нашел сообщение в блоге в 2008 году, в котором говорилось, в чем заключалась моя проблема и почему она возникает. Сообщение в блоге, подробно описывающее мою проблему .

Подводя итог публикации в блоге.Вы не можете сделать пользовательское сравнение объектов с EF Framework вообще.Например,

public Foo
{
public int ID{get;set;}
public string Name {get;set;}
//I overrode the .Equals AND the == operator
}

public getFoo(Foo target)
{
   DC.foos.FirstOrDefault(x => x == target);
}

System.NotSupportedException: невозможно создать постоянное значение типа 'Foo'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid ').

Это по проекту согласно MicroSoft.

Может кто-нибудь указать мне направление, чтобы найти, если этот вид сравнения объектовподдерживается, если я использую магический интерфейс или магическую перегрузку? большое спасибо!

Ответы [ 2 ]

6 голосов
/ 08 декабря 2011

Поскольку EF необходимо преобразовать ваши операторы LINQ в операторы SQL, вы не можете этого сделать. Если у вас есть сложная логика сравнения в переопределенном методе Equals(), вам придется продублировать ее в операторе LINQ.

Поскольку LINQ использует отложенное выполнение, вы, вероятно, можете инкапсулировать эту логику в методе, который возвращает IQueryable<T>, который вы можете включить в другом месте.

Вот пример:

public IQueryable<Foo> FoosEqualTo(IQueryable<Foo> allFoos, Foo target) {
    return from foo in allFoos
           where foo.Id == target.Id // or other comparison logic...
           select foo;
}

public Foo getFoo(Foo target) {
    return FoosEqualTo(DC.foos, target).FirstOrDefault();
}
1 голос
/ 29 ноября 2013

Я думаю, что вы можете сделать это, используя LinqKit PredicateBuilder и рефлексию.Кроме того, вы можете использовать отражение, чтобы сгенерировать цепочку из Where Expressions, чтобы сделать то же самое.

У меня нет времени, чтобы собрать пример, но я уверен, что вы можете сделатьэто так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...