2014-09-02 52 views
0

我正在开发一个项目,将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方法。我意识到有几个问题使得它不够理想,但是有一些原因是我在开始转换之前以这种方式编写的,这些问题不容易改变。

回答

0

例如

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

不,这个解决方案不起作用。我已经尝试了几种类似的技术来检查null值,然后评估它是否为空。所有这些都会导致LINQ操作返回查询的所有结果,或者不返回任何结果。这个解决方案没有返回任何结果,当一个SearchTerm完美工作时,这个操作是针对Linq到SQL版本的“Location”而不是实体运行的。我不理解底层技术如何可能需要这样一种不同的方法,因为没有任何东西可以使这个LINQ查询工作。 – Brandon 2014-09-03 13:01:22

+0

尽管如此,我认为使用AndAlso和OrElse是更好的做法。我在VB.net方面也不是很有经验(主要是.NET世界中的C#),我实际上已经忘记了VB.net世界中的Or/Else不同于&&和||在C#中。 – Brandon 2014-09-03 13:19:24

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在LINQ to SQL中运行时没有问题,从不碰到NullReference异常?

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

相关问题