这是我的错误
无法创建“Courses.Model.Track”类型的常量值。在此上下文中仅支持原始类型或枚举类型。
以下是导致它的代码:
model.Courses = db.Courses
.Where(c => model.Tracks.Any(t => t.Certification.ID == certificate))
.ToList();
另外,model.Courses
是IEnumerable<Courses>
,我不确定这是否与我的问题有关。
有人可以为我阐明这一点吗?非常感谢。
答案 0 :(得分:3)
db.Courses
是IQueryable
。虽然语法实际上与IEnumerable
的LINQ方法完全相同,但它们完全不同。
IQueryable
代码在任何地方实际上都不是 exectued 。它只是创建了一堆Expression
个对象,不同的查询提供者可以使用这些对象......无论他们想要什么(在这种情况下查询数据库)。那些查询提供程序需要专门具有代码来处理任何给定类型的输入。有些事情他们或者无法理智地转换为SQL查询,或者程序员根本没有想到或选择处理的事情(即使它可能有合理的SQL翻译)。
在sort中,查询提供程序只是不知道如何将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
子句。他们没有为您在第一次查询中所做的事情添加特定支持。
答案 1 :(得分:2)
尝试使用LINQ'Where In',这可以解决您的问题:
var names = new string[] { "Alex", "Colin", "Danny", "Diego" };
var matches = from person in people
where names.Contains(person.Firstname)
select person;
或强>
var matches = from person in people
where person.Firstname == "Alex" ||
person.Firstname == "Colin" ||
person.Firstname == "Danny" ||
person.Firstname == "Diego"
select person;
答案 2 :(得分:0)
我为这个几乎不必要的问题道歉,虽然@klugerama确实帮我解决了这个问题。
这有一个问题:
model.Courses = db.Courses
.Where(c => model.Tracks.Any(t => t.Certification.ID == certificate))
.ToList();
直到我改为:
model.Courses = db.Courses
.Where(c => c.Track.Certification.ID == certificate)
.ToList();
再次,我道歉。感谢大家的投入。