不,它是一個空引用異常,就像訪問var x = u.Address.Country.Code;
將是一個NullReferenceException
。
您必須始終確保LINQ to object中的對象不是null
,與其他任何代碼語句一樣。
你可以做到這一點無論使用您有&&
邏輯,或者你可以鏈Where
條款以及(儘管這會包含更多的迭代器,可能執行更慢):
var result = Users.Where(u => u.Address != null)
.Where(u.Address.Country != null)
.Where(u.Address.Country.Code == 12);
注意:本Maybe()
下面的方法只是作爲一種「你也可以」的方法提供,我並不是說它是好的或壞的,只是顯示一些人做的事情。如果你不喜歡Maybe()
我不重複投票如果你不喜歡我只是重複我見過的各種解決方案...
我見過一些Maybe()
擴展方法的書面,讓你做這種事情你要。有些人喜歡/不喜歡這些,因爲它們是在null
引用上運行的擴展方法。我不是說好或壞,只是有些人認爲這違反了良好的面向對象的行爲。
例如,您可以創建類似的擴展方法:
public static class ObjectExtensions
{
// returns default if LHS is null
public static TResult Maybe<TInput, TResult>(this TInput value, Func<TInput, TResult> evaluator)
where TInput : class
{
return (value != null) ? evaluator(value) : default(TResult);
}
// returns specified value if LHS is null
public static TResult Maybe<TInput, TResult>(this TInput value, Func<TInput, TResult> evaluator, TResult failureValue)
where TInput : class
{
return (value != null) ? evaluator(value) : failureValue;
}
}
然後執行:
var result = Users.Where(u => u.Maybe(x => x.Address)
.Maybe(x => x.Country)
.Maybe(x => x.Code) == 12);
從本質上講,這只是級聯的null
環比回落(或默認值的情況下的非參考類型)。
UPDATE:
如果您想提供一個非缺省值失敗值(說代碼爲-1,如果任何部分爲空),你只希望通過新的故障值到也許( ):
// if you wanted to compare to zero, for example, but didn't want null
// to translate to zero, change the default in the final maybe to -1
var result = Users.Where(u => u.Maybe(x => x.Address)
.Maybe(x => x.Country)
.Maybe(x => x.Code, -1) == 0);
就像我說的,這只是衆多解決方案之一。有些人不喜歡能夠調用null
參考類型的擴展方法,但有些人傾向於使用這種方法來解決這些級聯問題。
但是,目前,C#中沒有內置的無引號安全操作符,因此您要麼像以前一樣使用條件空值檢查,將您的Where()
語句鏈接起來,以便它們會過濾出null
,或者建立一些東西讓你像上面的Maybe()
方法那樣級聯null
。
現在它以語言實現(如果語法上相反),但在LINQ SQL翻譯中沒有作爲無操作實現,因此無法輕鬆使用。 – NetMage