无法创建常量值 - 仅允许原始类型或枚举类型

时间:2013-07-23 13:07:35

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

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

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函数语句以将le.FreqId byte转换为string后,我得到此异常,因为ToString()在LINQ表达式存储区中无法识别

ObjGetAllPendingPmntDetails是我模型中的一个部分类,它被添加,因为它在代码中使用了太多次以将数据绑定到表。 它同时包含ID秒,十进制'数量',PmntDtTmDatetimeIsDiscard为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列。但是存在一些问题,因为此查询没有满足条件的数据和上面共享的异常。

任何建议都值得赞赏,因为我无法理解问题的根本原因。

1 个答案:

答案 0 :(得分:3)

@AndrewCoonce是对的,.DefaultIfEmpty(ObjNull)是罪魁祸首。实体框架将DefaultIfEmpty转换为类似......

的内容

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

...但是无法将ObjGetAllPendingPmntDetails的实例强制转换为可以代替@param的内容,因此您会遇到异常。

如果您将DefaultIfEmpty调用移至ToList之后它应该正常工作(尽管如果您真的需要具体的列表实例,则需要再次调用ToList