C# LINQ-“;无法创建类型为[type]“的常量值;?

C# LINQ-“;无法创建类型为[type]“的常量值;?,c#,asp.net-mvc,linq,collections,C#,Asp.net Mvc,Linq,Collections,这是我的错误 无法创建“Courses.Model.Track”类型的常量值。在此上下文中仅支持基元类型或枚举类型 下面是导致它的代码: model.Courses = db.Courses .Where(c => model.Tracks.Any(t => t.Certification.ID == certificate)) .ToList(); 另外,model.Courses是IEnumerable,我不确定这是否与我的问题有关 有人能帮我解释一下吗?非常感

这是我的错误

无法创建“Courses.Model.Track”类型的常量值。在此上下文中仅支持基元类型或枚举类型

下面是导致它的代码:

model.Courses = db.Courses
    .Where(c => model.Tracks.Any(t => t.Certification.ID == certificate))
    .ToList();
另外,
model.Courses
IEnumerable
,我不确定这是否与我的问题有关


有人能帮我解释一下吗?非常感谢。

尝试使用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;

db.Courses
是一个
IQueryable
。虽然语法实际上与
IEnumerable
的LINQ方法相同,但实际上它们是完全不同的

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对象中执行所有这些操作的C#代码,那么这两个查询将是相同的,但对于查询提供程序来说则不是。它们只是有特殊的支持,可以知道何时看到
列表。包含
以将其映射到
子句中的SQL
。他们没有为您在第一次查询中所做的添加具体支持。

对于这个几乎不必要的问题,我深表歉意,尽管@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();

再次表示歉意。感谢大家的投入。

什么是
模型。轨道
?您正在选择db的每个值。课程:您没有在
中使用
c
做任何事情。在哪里(c=>…
子句。
certificate
应该是
c.certificate
?@lazyberezovsky
IEnumerable
@klugerama我想这可能是我的问题,我会查出来的。谢谢