2013-06-12 52 views
2

这是我的错误LINQ - “无法创建类型[类型]的常量值”?

无法创建类型'Courses.Model.Track'的常量值。只有原始类型或枚举类型在此上下文中受支持。

,这里是导致它的代码:

model.Courses = db.Courses 
    .Where(c => model.Tracks.Any(t => t.Certification.ID == certificate)) 
    .ToList(); 

此外,model.CoursesIEnumerable<Courses>,我不知道这有什么与我的问题。

有没有人可以为我阐明这一点?非常感谢。

+1

什么是'model.Tracks'? –

+3

您选择db.Courses的每一个值:你是不是做与'C'任何在'。哪里(C => ...'子句'certificate'应该是'c.certificate' – klugerama

+0

? @lazyberezovsky'IEnumerable的'。 – Kehlan

回答

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(); 

同样,我的道歉。感谢大家的意见。

2

尝试使用LINQ '在哪里',这应该解决您的问题:

var names = new string[] { "Alex", "Colin", "Danny", "Diego" }; 

var matches = from person in people 
     where names.Contains(person.Firstname) 
     select person; 

OR

var matches = from person in people 
     where person.Firstname == "Alex" || 
       person.Firstname == "Colin" || 
       person.Firstname == "Danny" || 
       person.Firstname == "Diego" 
     select person; 

http://blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

3

​​是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子句的时候有特别的支持。他们没有为您在第一个查询中做的事情添加特定的支持。

相关问题