2

这是我的错误

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

这是导致它的代码:

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

另外,model.Coursesis IEnumerable<Courses>,我不确定这是否与我的问题有关。

有人可以为我解释一下吗?非常感谢。

4

3 回答 3

3

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

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 objects 中执行所有这些的 C# 代码,那么这两个查询将是相同的,但对于查询提供程序来说它们不是。他们只是特别支持知道何时将List.Contains其映射到 SQLIN子句。他们没有为您在第一个查询中所做的添加特定支持。

于 2013-06-12T16:28:13.437 回答
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

于 2013-06-12T16:22:41.957 回答
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();

再次,我很抱歉。感谢大家的意见。

于 2013-06-12T16:33:38.053 回答