IEnumerable <dynamic>linq выражений - PullRequest
3 голосов
/ 21 марта 2011

У меня есть динамический список клиентов IEnumerable<Customer>

теперь я хочу, чтобы в этом списке были отдельные названия компаний?

Я думал, что мог бы сделать что-то вроде

 dynamic cur = (from c in result.Customers
                      select g.CompanyName).Distinct();

но сегодня узнал, что я не могу ... как я могу построить такой запрос?

Ответы [ 2 ]

5 голосов
/ 21 марта 2011

То, что вы делаете в коде и то, что вы спрашиваете в заголовке своего вопроса, - это две разные вещи.

Если вы хотите IEnumerable<dynamic>, вы должны сделать следующее:

IEnumerable<dynamic> cur = (from c in result.Customers
               select g.CompanyName).Cast<dynamic>().Distinct();

from c in result.Customers select g.CompanyName возвращает IEnumerable<string>.
Cast<dynamic>() возвращает IEnumerable<dynamic>.
Distinct() возвращает различных членов перечислимого.

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

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

4 голосов
/ 21 марта 2011

Пока класс Customer имеет члена CompanyName, вы определенно можете делать следующее:

var companies = (from c in result.Customers
                 select c.CompanyName).Distinct();

Использование ключевого слова dynamic над var не имеет никакого преимущества, кроме того факта, что оно предотвратит появление ошибок компилятора.

...