无法创建类型为[type]的常数值

本文关键字:type 常数值 创建 类型 | 更新日期: 2023-09-27 18:18:09

这是我的错误

无法创建'Courses.Model.Track'类型的常数值。在此上下文中只支持基本类型或枚举类型。

,下面是导致它的代码:

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

同时,model.CoursesIEnumerable<Courses>,我不确定这是否与我的问题有关。

有人能给我解释一下吗?多谢。

无法创建类型为[type]的常数值

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

如果这是c#代码,在LINQ中对对象执行所有这些,这两个查询将是相同的,但对于查询提供程序来说,它们不是。它们只是有特殊的支持,可以知道何时看到List.Contains并将其映射到SQL IN子句。他们没有为你在第一个查询中所做的添加具体的支持。

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

我为这个几乎不必要的问题道歉,尽管@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();
再次,我的道歉。感谢大家的意见。