实体框架总是为真

本文关键字:框架 实体 | 更新日期: 2023-09-27 17:52:40

我有一个简单的查询。我想获得的行在其他表中没有对应的行,或者如果有,那么SubField必须为false。

var list = ctx.Product.Where(p => p.Field == null || p.Field.SubField == false)

但是使用这个查询,我总是得到所有行,如果p. field为null无关紧要。即使我把第二个条件设为p字段。SubField== true我也得到所有行

我创建了简单的MessageBoxes来查看结果:

MessageBox.Show((c.Field== null).ToString());
result = true;
MessageBox.Show((c.Field.SubField == false).ToString());
result = object is not set exception
MessageBox.Show((c.Field == null || c.Field.SubField == false).ToString());
result = true;

我做错了什么?

实体框架总是为真

这是一个c#简化查询的例子。当p.Field == null求值为true时,试图查看第二部分是没有意义的,因为它是or表达式的一部分。考虑代码的这种变体,注意当Field为空时,Console.WriteLine不会执行:

设置:

public class Product
{
    public Field Field { get; set; }
}
public class Field
{
    public bool SubField { get; set; }
}
private bool GetSubField(Product product)
{
    Console.WriteLine("GetSubField");
    return product.Field.SubField;
}

执行示例:

var products = new List<Product>
{
    new Product { Field = null }
};
var list = products.Where(p => p.Field == null || GetSubField(p) == false);