有人可以解释为什么这会编译但在运行时创建异常,因为它无法正确转换为sql / entities吗?试图了解幕后发生的事情。
var data = (from e in db.Employees
join egp in db.EmployeeGrievanceMappings on e.EmployeeID equals egp.EmployeeID
join et in db.EmployeeTypes on egp.EmployeeTypeID equals et.EmployeeTypeID
where et.EmployeeTypeName == employeeeType
select new GrievantStewardBO()
{
Id = e.EmployeeADID,
EmployeeID = e.EmployeeID,
EmployeeTypeID = egp.EmployeeTypeID,
GrievanceID = egp.GrievanceID,
EmployeeGrievanceID = egp.EmployeeGrievanceID,
text = string.IsNullOrWhiteSpace( e.EmployeeLastName) ? e.EmployeeFirstName : e.EmployeeLastName + "," + e.EmployeeFirstName,
FirstName = e.EmployeeFirstName,
LastName = e.EmployeeLastName
}).
ToList();
我知道我可以写这个并让它正常工作,我只是想通过LINQ获得对类似run-ins的理解。
text = e.EmployeeLastName == null || e.EmployeeLastName.Trim() == "" ? e.EmployeeFirstName : e.EmployeeLastName + "," + e.EmployeeFirstName
相关问题:为什么Trim()在LINQ中正确转换?
答案 0 :(得分:4)
您正在使用“Linq to Entites”,可能是Entity Framework或Linq2Sql。使用Linq to Entites时,linq语句将被转换为表达式,并进行解析,然后转换为SQL查询。您遇到的问题就像编写“解析”步骤的人在解析器中不支持string.IsNullOrWhiteSpace
一样简单,因此它不知道如何将该函数转换为SQL字符串。
您必须使用您展示的长格式或更新到支持它的库的较新版本。它似乎是Entity Framework 6 does IsNullOrEmpty
的GitHub上的版本,也许你可以创建一个新的IsNullOrWhitespace方法并做一个请求将它合并进来。
答案 1 :(得分:0)
你有的LINQ有一个expression,它被翻译成SQL。有人必须评估表达式并创建生成的SQL。此过程不知道如何处理IsNullOrWhiteSpace()
,因此它将失败。
答案 2 :(得分:0)
为什么呢?没有人编写代码来处理您正在使用的LINQ提供程序中的此特定方法。某些过程不会将方法调用转换为SQL(或提供程序转换为的任何内容)。方法调用根据具体情况进行处理,并将常用方法硬编码到提供程序中。如果没有人编写代码来处理这种方法,那么该方法就不起作用了。
另一方面,为什么他们没有处理这种特定的方法呢?可能他们要么重复使用LINQ to SQL的代码来生成代码,要么他们想要使用.NET framework 3.5并且这个方法在4.0中添加