为什么LINQ不能翻译string.IsNullOrWhiteSpace()?

时间:2016-10-18 17:05:04

标签: c# linq

有人可以解释为什么这会编译但在运行时创建异常,因为它无法正确转换为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中正确转换?

3 个答案:

答案 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中添加