db.Courses
是一个IQueryable
。虽然语法实际上与 LINQ 方法相同,但在本质上IEnumerable
它们是完全不同的。
该IQueryable
代码实际上根本没有在任何地方执行。它只是创建了一堆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 to objects 中执行所有这些的 C# 代码,那么这两个查询将是相同的,但对于查询提供程序来说它们不是。他们只是特别支持知道何时将List.Contains
其映射到 SQLIN
子句。他们没有为您在第一个查询中所做的添加特定支持。