我在这里看到了一些与此异常相关的问题,但没有一个让我理解问题的根本原因。所以我们还有一个......
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
秒,十进制'数量',PmntDtTm
为Datetime
,IsDiscard
为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
列。但是存在一些问题,因为此查询没有满足条件的数据和上面共享的异常。
任何建议都值得赞赏,因为我无法理解问题的根本原因。
答案 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
)