LINQ:将查询表达式转换为使用lambdas

itc*_*chi 1 c# linq lambda

我正在尝试将LINQ To Entities查询重写为表达式.我的模特是一所可以有很多人的学校.人员继承给教师,学生等.

以下查询适用于我:

IQueryable<DAL.TEACHER> teacher = 
from p in School 
select p.PERSON as ESBDAL.TEACHER;
Run Code Online (Sandbox Code Playgroud)

我如何将其写为查询表达式?我想的是:

IQueryable<DAL.TEACHER> teacher = 
School.Select(x=>x.PERSON) as IQueryable<DAL.TEACHER>;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种说法不起作用.我误会了.Select()吗?

Aar*_*ght 7

它应该是:

School.Select(x => x.PERSON as DAL.TEACHER)
Run Code Online (Sandbox Code Playgroud)

记住,你正在尝试将其转换PERSON为a TEACHER,因此它会进入委托.结果School.Select(x => x.PERSON)本身实际上是一个IEnumerable<PERSON>,不可转换为IEnumerable<TEACHER>.

还有一件事 - 如果某些PERSON实例实际上并不是TEACHERs(即它们是STUDENTs代替),那么你最终会null得到输出中的引用.如果PERSON可以有多种类型,您可能希望将其写为:

School.Select(x => x.PERSON).OfType<DAL.TEACHER>();
Run Code Online (Sandbox Code Playgroud)

这实际上会过滤掉所有 s 的PERSON实体,因此您只能获取序列中的实例(无空值). TEACHERTEACHER

另请注意,from x in y语法是"查询"(特别是查询理解语法).第二种形式是lambda语法.