gpt4 book ai didi

c# - LINQ- "Unable to create constant value of type [type]"?

转载 作者:行者123 更新时间:2023-12-02 22:00:21 24 4
gpt4 key购买 nike

这是我的错误

Unable to create a constant value of type 'Courses.Model.Track'. Only primitive types or enumeration types are supported in this context.

这是导致它的代码:

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

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

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

最佳答案

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 object 中执行所有这些操作的 C# 代码,则两个查询将是相同的,但对于查询提供程序而言,它们不是相同的。他们只是有特殊的支持来了解何时看到 List.Contains 将其映射到 SQL IN 子句。他们没有为您在第一个查询中所做的操作添加具体支持。

关于c# - LINQ- "Unable to create constant value of type [type]"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17070458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com