【问题标题】:Unable to create a constant value - only primitive types or Enumeration types allowed无法创建常量值 - 仅允许原始类型或枚举类型
【发布时间】:2013-07-25 08:42:24
【问题描述】:

我在这里看到了一些与此异常相关的问题,但没有一个让我了解问题的根本原因。所以这里我们还有一个......

var testquery = 
((from le in context.LoanEMIs.Include("LoanPmnt")
  join lp in context.LoanPmnts on le.Id equals lp.LoanEMIId
  where lp.PmntDtTm < date && lp.IsPaid == false
  && le.IsActive == true && lp.Amount > 0
  select new ObjGetAllPendingPmntDetails
  {
      Id = lp.Id,
      Table = "LoanEMI",
      loanEMIId = lp.LoanEMIId,
      Name = le.AcHead,
      Ref = SqlFunctions.StringConvert((double)le.FreqId),
      PmntDtTm = lp.PmntDtTm,
      Amount = lp.Amount,
      IsDiscard = lp.IsDiscarded,
      DiscardRemarks = lp.DiscardRemarks
  }).DefaultIfEmpty(ObjNull));

  List<ObjGetAllPendingPmntDetails> test = testquery.ToList();

此查询给出以下异常消息 -

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

在我添加 SQL 函数语句以将 byte 转换为 string 的 SQL 函数语句后出现此异常,因为 ToString() 在 LINQ 表达式存储中无法识别。

ObjGetAllPendingPmntDetails 是我的模型中的一个部分类,因为它在代码中用于将数据绑定到表的次数过多而被添加。 它有两个 IDs 一样长,'Amount' 作为十进制,PmntDtTm 作为 DatetimeIsDiscard 作为 bool,其余都是字符串,包括 'Ref'。

我没有得到任何结果,因为目前没有数据满足条件。在尝试处理 null 时,我添加了 DefaultIfEmpty(ObjNull)ObjNull 已将所有属性初始化如下。

ObjGetAllPendingPmntDetails ObjNull = new ObjGetAllPendingPmntDetails()
{ Id = 0, Table = "-", loanEMIId = 0, Name = "-", Ref = "-",
  PmntDtTm = Convert.ToDateTime("01-01-1900"),
  Amount = 0, IsDiscard = false, DiscardRemarks = "" };

我需要这个查询正常工作,因为它调用了 Union() 和其他 5 个查询。所有返回相同的ObjGetAllPendingPmntDetails 列。但是存在一些问题,因为该查询没有满足条件的数据和上面共享的异常。

感谢任何建议,因为我无法理解问题的根本原因。

【问题讨论】:

  • 您的.DefaultIfEmpty(ObjNull) 代码在我看来很可疑。实际上,这看起来没有必要,因为您正在对结果调用.ToList()。您真的希望“未找到匹配项”的情况尝试返回长度为 1 的 List 吗?

标签: linq linq-to-sql linq-to-entities


【解决方案1】:

@AndrewCoonce 是对的,.DefaultIfEmpty(ObjNull) 是这里的罪魁祸首。 Entity Framework 将DefaultIfEmpty 变成类似...

CASE WHEN ([Project1].[C1] IS NULL) THEN @param ELSE [Project1].[Value] END AS [C1]

...但是没有办法将ObjGetAllPendingPmntDetails 的实例强制转换为可以代替@param 的东西,所以你会得到一个例外。

如果您将DefaultIfEmpty 调用移到ToList 之后,它应该可以正常工作(但如果您真的想要一个具体的列表实例,则需要在此之后再次调用ToList)。

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多