2015-06-01 59 views
0

我有簡單的查詢。我想獲取在其他表中沒有對應行的行,或者如果它有,那麼SubField必須是false。總是如果實體框架

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

但是在這個查詢中,如果p.Field爲空,我總是得到所有行並不重要。即使我將第二個條件設置爲p.Field.SubField == true,我也會獲得所有行。

我創建了簡單的消息框,看看結果:

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; 

我做錯了嗎?

+2

愚蠢的問題,但實際上,你有'具有'SubField == true'字段的產品?你的查詢沒有任何明顯的錯誤。 –

+1

該框架不說謊。 – SimpleVar

+0

你正在檢查SubField == false,它會給你一個例外,說它沒有設置。它看起來像SubField對象可以爲null。 – nik0lias

回答

0

這是C#爲您查詢的簡短查詢示例。當p.Field == null的計算結果爲true時,沒有意思看第二部分,因爲它是or表達式的一部分。考慮你的代碼的這種變化,請注意,當Field爲null,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);