是IQueryable
。虽然语法实际上与IEnumerable
的LINQ方法相同,但它们在之下完全是的不同。
的IQueryable
代码实际上不是exectued任何地方都没有。它只是创建了一堆Expression
对象,不同的查询提供者可以使用它来做他们想要的任何事情(在这种情况下查询数据库)。那些查询提供者需要专门具有处理任何给定类型的输入的代码。有些东西或者不能合理地转化为SQL查询,或者是程序员根本没有想到或选择处理的东西(即使它可能有一个明智的SQL转换)。
在排序,查询提供者只是不知道如何将model.Tracks.Any(t => t.Certification.ID == certificate)
翻译成SQL。
你只需要知道你正在使用的查询提供程序是什么类型的代码并且不支持它,并尝试操纵你可以处理的代码。像这样的东西应该工作:
var certificates = model.Tracks.Select(t => t.Certification.ID).ToList();
model.Courses = db.Courses
.Where(c => certificates.Contains(c))
.ToList();
如果这是执行所有这一切都在LINQ到对象的两个查询将是相同的C#代码,而是一个查询提供他们不是。他们只是在知道何时将List.Contains
映射到SQL IN
子句的时候有特别的支持。他们没有为您在第一个查询中做的事情添加特定的支持。
什么是'model.Tracks'? –
您选择db.Courses的每一个值:你是不是做与'C'任何在'。哪里(C => ...'子句'certificate'应该是'c.certificate' – klugerama
? @lazyberezovsky'IEnumerable的'。 –
Kehlan