在 Linq 语句的 Where 子句中,像这样,
var myClasses = (from b in db.MyRecords
join p in db.People on b.PersonId equals p.PersonId
join cse in db.Courses on b.CourseId equals cse.CourseId
where (b.Active == 1)
select new { b });
表达式b.Active==1
工作正常。但如果我这样做,
Expression<Func<MyRecords, bool>> filter = my => my.Active == 1;
[更新:由于汉斯的回答,我将其保留为原始内容,但实际上,我在这里打错了。表达式实际上使用的是底层类型,而不是像查询 Linq 那样生成的复数形式。我其实有这个
Expression<Func<MyRecord, bool>> filter = my => my.Active == 1;
]
试试这个,
var myClasses = (from b in db.MyRecords
join p in db.People on b.PersonId equals p.PersonId
join cse in db.Courses on b.CourseId equals cse.CourseId
where (filter)
select new { b });
编译器抱怨,
无法将查询表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
我已经看到很多这样的问题,但我不明白为什么它不起作用。我误解了基本原理,所以我并不是真的要求任何人编写代码。我想知道 Linq 想要什么,所以我对 Linq 有更好的理解,而不仅仅是做一些事情。这有效,例如,
var myClasses = (from b in db.MyRecords.Where(filter)
join p in db.People on b.PersonId equals p.PersonId
join cse in db.Courses on b.CourseId equals cse.CourseId
select new { b });
我想知道为什么它在那里工作,而不是在加入后的 Where 中。如果我在连接结束时执行 Where,编译器仍然知道 MyRecords 字段,包括 Active。
我认为这就是我所追求的正确描述,因为它似乎很适合我的可能。