Linq для юридических лиц: Союзы + Отдельные - PullRequest
10 голосов
/ 19 февраля 2010

Я не знаю, как я могу сделать несколько союз с отличным.

Когда я использую .Distinct с IEqualityComparer, исключение в броске:

LINQ to Entities не распознает метод 'System.Linq.IQueryable'

Мой код

var union = query.Union(query1).Union(query2);
union = union.Distinct(new EqualityComparerTransaction());

Ответы [ 2 ]

9 голосов
/ 19 февраля 2010

LINQ to Entities не поддерживает перегрузку Distinct, которая занимает IEqualityComparer. Когда вы думаете об этом, это действительно невозможно, поскольку запросы LINQ to Entities будут преобразованы в SQL, и вы не сможете преобразовать ссылку на интерфейс в SQL.

Следовательно, вы должны либо:

  1. Используйте перегрузку Distinct, которая не требует сравнения, или
  2. Перенесите оба списка в пространство объектов и выполните Distinct в LINQ to Objects, например:

    var union = query.Union(query1).Union(query2);
    union = union.AsEnumerable().Distinct(new EqualityComparerTransaction());
    

Естественно, риск здесь заключается в том, что вы можете принести слишком много записей с сервера БД. Вы также можете использовать оба эти метода для выполнения части сравнения на сервере и другой части в объектном пространстве.

0 голосов
/ 15 апреля 2012

На вопрос ответили, но я просто хочу поделиться своим опытом.

Не уверен, но я думаю, что в сообщении об ошибке говорится о том, что метод Distinct не поддерживается этим аргументом, я думаю.

На самом деле мы просто хотим, чтобы Linq to SQL, выражение с запросом, которое говорит, что эти свойства тоже получают одно из них.

Но когда мы используем класс, такой как EqualityComparerTransaction, он не может быть нормально переведен в sql.

Существует еще один метод GetDistict (string propertyName) Но, к сожалению, он не работает так, как мы ожидали. Этот метод также идет в БД (что еще наш источник) и получить некоторые данные и оценить различные.

Если бы метод расширения GetDistinct (string propertyName) выполнял преобразование sql, это могло бы быть. Но нет пути.

К сожалению, единственный способ сделать это - кодировать ваше собственное расширение для LINQ_TO_SQL. Я не думаю, что это будет легко! Поэтому перечисление данных на стороне сервера пока кажется самым простым.

...