【问题标题】:EF6 Lambda Query Error: Unable to create a constant of type ... Only primitive types of enumeration types are supported in this contextEF6 Lambda Query Error: Unable to create an constant of type ... 此上下文仅支持枚举类型的原始类型
【发布时间】:2015-07-17 22:58:17
【问题描述】:

当我执行下面的查询时,我不断收到以下错误。我不知道还有什么办法可以满足我的条件。我无法找到与其他产生相同错误输出的问题相同的问题。

Unable to create a constant value of type 'Project.Models.Bill'. Only primitive types or enumeration types are supported in this context.

代码:

var billResults = db.Database.SqlQuery<Bill>("exec [dbo].[sp_getBills]").AsQueryable();

var results = db.Bills.Select(
                        a => new
                        {
                            a.Id,
                            a.Col1,
                            a.Col2,
                            ErrorCount = (int) (billResults.Where(x => x.BillResultsId == a.Id).Count())
                        }).Where(a => a.Col1 == "Test123");

我会很感激任何帮助 - 过去几个小时一直在这方面卡住了。

谢谢!

【问题讨论】:

  • 注释掉查询的不同部分,直到找出导致错误的确切原因。
  • @FranciscoGoldenstein 这是 ErrorCount 行.. 但我想不出另一种方法来完成它。
  • Where 子句应该在 Select 子句之前 ;)
  • @drooksy 谢谢,注意到了。 :)

标签: c# .net entity-framework lambda


【解决方案1】:

错误表明您不能在该表达式中使用 a.Id,只能使用常量值。 a.Id 依赖于 db.Bills 查询的 Where 子句。

您可以通过三种方式解决此问题:

1) 使用属性 Id、Col1、Col2 和 ErrorCount 定义一个类(我们称之为 X)。从此查询中删除 ErrorCount,而不是创建一个匿名对象,而是创建一个 X 类型的对象(不会设置 ErrorCount)。遍历集合并设置 ErrorCount。

2) 使用实体框架使用CROSS APPLY:阅读Entity Framework and CROSS/OUTER APPLY

应该是这样的:

from t1 in billResults 
from t2 in db.Bills.Where(t2 => t2.Id== t1.BillResultsId )
select new { ... }

3) 考虑创建存储过程并使用 CROSS APPLY 连接来实现您所需要的(在此处阅读 CROSS APPLY https://www.mssqltips.com/sqlservertip/1958/sql-server-cross-apply-and-outer-apply/

【讨论】:

  • 采用存储过程方法。感谢您提供有关交叉应用的链接...学到了一些新东西! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多