【问题标题】:NullReference exception when using LINQ Contains with Entity Framework使用 LINQ 包含实体框架时出现 NullReference 异常
【发布时间】:2014-10-27 06:16:57
【问题描述】:

我正在做一个项目,我正在将 Linq 转换为 SQL(我承认我对它的理解很差)到 Linq 到 Entity 并且遇到了一个奇怪的情况。下面的代码在针对 Linq to SQL 设计器中生成的类进行评估时正确返回结果,但在针对实体框架实体运行时不起作用。具体来说,如果 Or 子句中的任何属性为空,则该过程会因空引用异常而中断。我已经尝试过检查 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 过滤结果。我知道这有几个问题使它不太理想,但是在我开始转换之前以这种方式编写的原因是不容易改变的。

【问题讨论】:

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


    【解决方案1】:

    例如

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

    【讨论】:

    • 不,此解决方案不起作用。我尝试了几种类似的技术来检查 null 的值,然后在它不为 null 时对其进行评估。所有这些要么导致 LINQ 操作返回查询的所有结果,要么不返回。此解决方案不返回任何结果,当针对“位置”的 Linq to SQL 版本而不是实体运行此操作时,SearchTerm 可以完美运行。我不明白底层技术如何需要这种不同的方法,以至于没有任何东西可以使这个 LINQ 查询工作。
    • 我确实认为使用 AndAlso 和 OrElse 是一种更好的做法。我在 VB.net 方面也不是很有经验(在 .NET 世界中主要是 C#),实际上我已经忘记了 VB.net 世界中的 Or / Else 与 && 和 || 不同。在 C# 中。
    【解决方案2】:

    所以我最终得到的答案是使用 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 的任何大小写都将匹配结果的任何大小写隐含的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多