我有以下代码,当我向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
语句不同吗?
在进入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)); }