使用LINQ Contains with Entity Framework时出现NullReference异常

时间:2014-09-02 21:20:00

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

我正在开展一个项目,我将Linq转换为SQL(我不太理解),Linq to Entity并遇到了一个奇怪的情况。下面的代码在针对Linq to SQL设计器中生成的类进行求值时正确返回结果,但在针对Entity Framework实体运行时不起作用。具体来说,如果Or子句中的任何属性为null,则该进程会以Null Reference异常中断。我已经尝试了检查null属性的技术然后说,传递一个我知道不能在SearchTerm中的值来短路,但它们只会导致这个LINQ返回来自实体的所有结果我也不太了解的方式。

        Return (From values In Location.getData _
                Where (values.LocName.Contains(SearchTerm) _
                Or values.Address.Contains(SearchTerm) _
                Or values.Address2.Contains(SearchTerm) _
                Or values.City.Contains(SearchTerm) _
                Or values.State.Contains(SearchTerm) _
                Or values.QIM.Contains(SearchTerm) _
                Or values.MacID.Contains(SearchTerm) _
                Or values.Phone.Contains(SearchTerm) _
                Or values.PrimServ.Contains(SearchTerm) _
                Or values.Zip.Contains(SearchTerm) _
                Or values.Area.Contains(SearchTerm) _
                Or values.Type.Contains(SearchTerm)
                ) And (values.Status <> "Closed" Or status_parm = "Closed")
            Select values)

正如你可能猜到的那样,实体类Location上的getData方法基本上是使用DbContext.SqlQuery来构造数据库中的查询,然后使用这个LINQ来过滤结果。我知道有几个问题导致它不太理想,但有理由在我开始转换之前以这种方式写出来并不容易改变。

2 个答案:

答案 0 :(得分:0)

E.g。

Where (values.LocName IsNot Nothing AndAlso values.LocName.Contains(SearchTerm)) OrElse
      (values.Address IsNot Nothing AndAlso values.Address.Contains(SearchTerm))

答案 1 :(得分:0)

所以我最终得到的答案是使用ToLower

SearchTerm = SearchTerm.ToLower

Return (From values In Location.getData _
Where (values.LocName IsNot Nothing And Also values.LocName.ToLower.Contains(SearchTerm)

我仍然想了解两件事:

  1. 为什么在使用LINQ to Entity时需要检查null,在LINQ to SQL中它运行没有问题且从不遇到NullReference异常?

  2. 为什么LINQ的.Contains在LINQ to SQL中不区分大小写,但它在这里?我已经100%确定地验证了使用LINQ to SQL的相同代码不会抛出NullReference异常,并且不需要将.Contains作为区分大小写的函数处理(因此SearchTerm的任何外壳都将匹配结果的任何大小写)隐式地)。