我正在开发一个项目,将Linq转换为SQL(我承认这很难理解),并且遇到了奇怪的情况。下面的代码在针对Linq to SQL设计器中生成的类进行求值时正确返回结果,但在针对实体框架实体运行时无法运行。特别是如果Or子句中的任何属性都为空,则该进程将打破Null引用异常。我试过技术检查空属性,然后说,传递一个值,我知道不能在SearchTerm周围短路,但他们只是导致这个LINQ返回来自实体的所有结果,我以某种方式返回真的不明白。当使用LINQ包含实体框架时的NullReference异常
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)
正如你可以基本上是使用DbContext.SqlQuery构造查询到数据库中,然后被用于这个LINQ过滤结果可能猜到的实体类位置GetData方法。我意识到有几个问题使得它不够理想,但是有一些原因是我在开始转换之前以这种方式编写的,这些问题不容易改变。
不,这个解决方案不起作用。我已经尝试了几种类似的技术来检查null值,然后评估它是否为空。所有这些都会导致LINQ操作返回查询的所有结果,或者不返回任何结果。这个解决方案没有返回任何结果,当一个SearchTerm完美工作时,这个操作是针对Linq到SQL版本的“Location”而不是实体运行的。我不理解底层技术如何可能需要这样一种不同的方法,因为没有任何东西可以使这个LINQ查询工作。 – Brandon 2014-09-03 13:01:22
尽管如此,我认为使用AndAlso和OrElse是更好的做法。我在VB.net方面也不是很有经验(主要是.NET世界中的C#),我实际上已经忘记了VB.net世界中的Or/Else不同于&&和||在C#中。 – Brandon 2014-09-03 13:19:24