首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ef表达式对许多人使用“无法创建类型(类型)的常量值”。

使用ef表达式对许多人使用“无法创建类型(类型)的常量值”。
EN

Stack Overflow用户
提问于 2013-08-08 07:00:53
回答 3查看 138关注 0票数 2

我有一张关于CustomerGroups和产品的折扣表。

密钥:

  • 产品有关键的int ProductID。
  • 折扣有关键的int DiscountID。
  • CustomerGroup有键int CustomerGroupID。

关系:

  • 折扣和CustomerGroups之间的关系是一对多的和可空的(折扣有一个可空的CustomerGroup)。
  • 折扣和产品之间的关系是多到多的,并通过连接表Discount_Products.该表有一个由两个ints、DiscountID和ProductID组成的复合键。这个连接表在我的模型图中是自动不可见的,我得到一个两端都是*的关系。

我有一个使用EF填充的变量Discounts1:

代码语言:javascript
运行
复制
IQueryable<Models.Discount> Discounts1 = _entities.Discounts;

我想要的是要求所有折扣百分比的折扣,是没有联系的客户集团,并与某一特定的产品。

我尝试使用的linq表达式是:

代码语言:javascript
运行
复制
var candidates = (from discount in Discounts1
  where (discount.CustomerGroup == null)
  && discount.Products.Contains(product)
  select discount.Percentage).ToList();

当我运行这段代码时,我得到的是一个带有消息的NotSupportedException

无法创建“Models.Product”类型的常量值。在此上下文中只支持基本类型或枚举类型。

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-08 07:03:34

实体框架无法将Contains(product)转换为SQL代码。你的问题在于:

代码语言:javascript
运行
复制
discount.Products.Contains(product)

您应该通过它的ProductID来搜索产品,这应该是一个基本类型。

这是一个已知的问题,记录在这里:引用不支持的非标量变量

不支持在查询中引用非标量变量(例如实体)。当执行这种查询时,会抛出一个NotSupportedException异常,其中的消息声明“无法创建EntityType类型的常量值。在此上下文中只支持基本类型(例如Int32、String和Guid')”。

票数 2
EN

Stack Overflow用户

发布于 2013-08-08 07:11:52

Contains会破坏非原语类型,尽管您可以用一种更简单的方式重写查询以避免它(假设Product有一个原始ProductId列)

代码语言:javascript
运行
复制
from d in Discounts1
from p in d.Products
where d.CustomerGroup == null && p.ProductId == product.ProductId
select d.Percentage
票数 1
EN

Stack Overflow用户

发布于 2013-08-08 07:14:02

这是一个解决办法,亚历克斯是第一个回答的,所以我标记他为解决者。

代码语言:javascript
运行
复制
var candidates = (from discount in Discounts1
  where (discount.CustomerGroup == null)
  && discount.Products.Any(p=>p.ProductID == product.ProductID)
  select discount.Percentage).ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18119799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档