LINQ to SQL布尔值的评估顺序

 奥黛丽凵赫本 发布于 2023-02-09 18:10

我有以下代码,当我向PerformQuery方法提供null参数时,它生成一个空引用异常.

public class MyObject
{
    public Guid Guid { get; private set; }
}
public class TableObject
{
    // This is a Guid stored as a string
    public string Hash { get; set; }
}
public DataContext context;
public TableObject PerformQuery(MyObject obj)
{
    return context.TableObjects.FirstOrDefault(tableObject =>
        obj != null &&
            // Why is this side of the condition being evaluated if obj is null?
        string.Equals(obj.Guid.ToString(), tableObject.Hash));
}

我确定它TableObject不是空的.怎么可能呢?并且它的属性Hash不可为空,所以它也不应该为空(尽管我已经检查了null并没有改进).

我通过在执行查询之前计算我正在搜索的Guid字符串自己解决了这个问题,但我很好奇为什么LINQ继续评估条件,即使obj是null.这是因为LINQ to SQL优化,布尔值的评估顺序与传统if else语句不同吗?

1 个回答
  • 在进入LINQ to SQL查询之前,应该评估本地对象.数据库无法知道您的对象是否为空.

     public TableObject PerformQuery(MyObject obj) {
            if (obj == null) {return null;}
    
            // also pull this out of the LINQ logic.
            string objGuid = obj.Guid.ToString();
    
            return context.TableObjects.FirstOrDefault(tableObject => 
                string.Equals(objGuid, tableObject.Hash));
        }
    

    2023-02-09 18:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有