LINQ: преобразование выражения запроса для использования лямбда-выражений - PullRequest
1 голос
/ 12 марта 2010

Я пытаюсь переписать запрос LINQ To Entities в выражение. Моя модель - школа, в которой может быть много людей. Лица передаются по наследству учителям, студентам и т. Д.

У меня работает следующий запрос:

IQueryable<DAL.TEACHER> teacher = 
from p in School 
select p.PERSON as ESBDAL.TEACHER;

Как бы я написал это как выражение запроса? Я думал что-то вроде:

IQueryable<DAL.TEACHER> teacher = 
School.Select(x=>x.PERSON) as IQueryable<DAL.TEACHER>;

К сожалению, это утверждение не работает. Я неправильно понимаю .Select()?

1 Ответ

7 голосов
/ 12 марта 2010

На самом деле должно быть:

School.Select(x => x.PERSON as DAL.TEACHER)

Помните, что вы пытаетесь привести PERSON к TEACHER, поэтому внутри делегата. Результат School.Select(x => x.PERSON) сам по себе является на самом деле IEnumerable<PERSON>, который не может быть преобразован в IEnumerable<TEACHER>.

Еще одна вещь - если некоторые PERSON экземпляры на самом деле не являются TEACHER s (т.е. вместо них STUDENT s), вы получите в итоге null ссылки в выходных данных. Если PERSON может быть более одного типа, вы, вероятно, захотите записать его следующим образом:

School.Select(x => x.PERSON).OfType<DAL.TEACHER>();

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

Также обратите внимание, что синтаксис from x in y является «запросом» (в частности, синтаксис понимания запроса ). Вторая форма - это лямбда-синтаксис.

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