gpt4 book ai didi

LINQ 查询检查是否为空

转载 作者:行者123 更新时间:2023-12-04 22:37:45 26 4
gpt4 key购买 nike

我有一个用户列表,有些用户没有名字(空)。如果我运行第一个 LINQ 查询,则会收到一条错误消息,指出“未将对象引用设置为对象的实例”错误。

var temp = (from a in userList
where ((a.name == "john") && (a.name != null))
select a).ToList();

但是,如果我通过将检查 null 放在前面来切换顺序,则它可以正常工作而不会引发任何错误:
var temp = (from a in userList
where ((a.name != null) && (a.name == "john"))
select a).ToList();

这是为什么?如果那是纯 C# 代码(不是 LINQ),我认为两者都是一样的。我没有 SQL 分析器,我只是好奇在 SQL 级别翻译它们时会有什么不同。

最佳答案

在 C# 中 && operator是短路的,因此如果第一个条件返回 false,则根本不执行第二个条件。来自 MSDN:

The conditional-AND operator (&&) performs a logical-AND of its bool operands, but only evaluates its second operand if necessary.



|| operator行为方式类似,不同之处在于,如果第一个参数返回 true,则它不会评估其第二个参数。

不过,我不认为这是完整的故事。我的帖子的其余部分涵盖了以下几点:
  • 您可以使用 DataContext.Log 记录 SQL 语句。
  • 无论您以哪种方式编写查询,您的查询都不应该产生错误。
  • LINQ to objects 和 LINQ to SQL 之间的行为存在差异。
  • 您的过滤可能在本地而不是在数据库中执行。

  • 您可以在 Visual Studio 中轻松查看生成的 SQL,而无需 SQL 探查器。您可以将鼠标悬停在 LINQ to SQL 查询对象上,它将显示 SQL。或者您可以使用 DataContext.Log 记录 SQL 语句,例如:
    TextWriter textWriter = new StringWriter();
    using (var dc = new UserDataContext())
    {
    dc.Log = textWriter;
    var userList = dc.Users;
    var temp = (from a in userList
    where (a.Name.ToString() == "john") && (a.Name != null)
    select a).ToList();
    }
    string log = textWriter.ToString();

    您还可以登录到文件甚至 Console.Out :
    dc.Log = Console.Out;

    这样做你可以看到查询看起来像这样,尽管你可能会在选择列表中有更多的列:
    SELECT [t0].[Name]
    FROM [dbo].[User] AS [t0]
    WHERE ([t0].[Name] = @p0) AND ([t0].[Name] IS NOT NULL)

    另一点是您的查询不应产生错误。即使 a.name为空, a == "john"应该仍然有效 - 它只会返回 false。

    最后,C# 的正常工作方式与 LINQ to SQL 的工作方式之间存在差异。您不应该从数据库中获得空异常。为了证明这一点,我将对您的查询做一个小的修改 - 添加一个 ToString之后 a.Name :
    var temp = (from a in userList
    where (a.Name.ToString() == "john") && (a.Name != null)
    select a).ToList();

    现在这对于带有 NullReferenceException 的 Linq to Objects 失败,但它适用于 LINQ to SQL 而不会引发异常。所以我怀疑您已将数据库中的所有项目加载到内存中并在本地进行过滤。换句话说,也许你有这样的事情:
    var userList = dc.Users.ToList();

    而不是以下允许数据库进行过滤的内容:
    var userList = dc.Users;

    所以我怀疑这个问题比眼睛看到的要多。也许您可以提供更多详细信息。

    关于LINQ 查询检查是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2842334/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com