我正在开展一个项目,我将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来过滤结果。我知道有几个问题导致它不太理想,但有理由在我开始转换之前以这种方式写出来并不容易改变。
答案 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)
我仍然想了解两件事:
为什么在使用LINQ to Entity时需要检查null,在LINQ to SQL中它运行没有问题且从不遇到NullReference异常?
为什么LINQ的.Contains在LINQ to SQL中不区分大小写,但它在这里?我已经100%确定地验证了使用LINQ to SQL的相同代码不会抛出NullReference异常,并且不需要将.Contains作为区分大小写的函数处理(因此SearchTerm的任何外壳都将匹配结果的任何大小写)隐式地)。