2

我有一个与 CustomerGroups 和 Product 相关的表 Discounts。

键:

  • 产品具有密钥 int ProductID。
  • Discount 具有键 int DiscountID。
  • CustomerGroup 具有密钥 int CustomerGroupID。

关系:

  • Discounts 和 CustomerGroups 之间的关系是一对多且可为空的(折扣有一个可为空的 CustomerGroup)。
  • Discounts 和 Products 之间的关系是多对多的,并且通过连接表 Discount_Products 进行。该表有一个由两个整数 DiscountID 和 ProductID 组成的复合键。该连接表在我的模型图中自动不可见,并且我得到一个两端都是 * 的关系。

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

IQueryable<Models.Discount> Discounts1 = _entities.Discounts;

我想要的是询问与客户群无关且与特定产品相关的折扣的所有折扣百分比。

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

var candidates = (from discount in Discounts1
  where (discount.CustomerGroup == null)
  && discount.Products.Contains(product)
  select discount.Percentage).ToList();

运行此代码时得到的是带有消息的 NotSupportedException

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

我究竟做错了什么?

4

3 回答 3

2

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

discount.Products.Contains(product)

您应该通过 it's 搜索产品ProductID,它应该是原始类型。

这是此处记录的已知问题:不支持引用非标量变量

不支持在查询中引用非标量变量,例如实体。执行此类查询时,将引发 NotSupportedException 异常,并显示一条消息,指出“无法创建 EntityType 类型的常量值。在此上下文中仅支持原始类型('例如 Int32、String 和 Guid')。”

于 2013-08-08T07:03:34.793 回答
1

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

from d in Discounts1
from p in d.Products
where d.CustomerGroup == null && p.ProductId == product.ProductId
select d.Percentage
于 2013-08-08T07:11:52.417 回答
0

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

var candidates = (from discount in Discounts1
  where (discount.CustomerGroup == null)
  && discount.Products.Any(p=>p.ProductID == product.ProductID)
  select discount.Percentage).ToList();
于 2013-08-08T07:14:02.117 回答