LINQ - “无法创建类型[类型]的常量值”?

时间:2013-06-12 16:17:48

标签: 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.CoursesIEnumerable<Courses>,我不确定这是否与我的问题有关。

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

3 个答案:

答案 0 :(得分:3)

db.CoursesIQueryable。虽然语法实际上与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;

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

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

再次,我道歉。感谢大家的投入。