3

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

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。此上下文仅支持原始类型或枚举类型。

le.FreqId在添加 SQL 函数语句以将其转换为LINQ 表达式存储中无法识别的bytea后,我得到了这个异常。stringToString()

ObjGetAllPendingPmntDetails是我的模型中的一个部分类,由于它在代码中用于将数据绑定到表的次数过多而被添加。它既有IDs 长,'Amount' 为十进制,PmntDtTmas 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列。但是存在一些问题,因为这个查询没有满足条件的数据和上面共享的异常。

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

4

1 回答 1

3

@AndrewCoonce 是对的,这.DefaultIfEmpty(ObjNull)是罪魁祸首。实体框架变成DefaultIfEmpty了...

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

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

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

于 2013-07-25T00:42:24.897 回答