代わりに例外を避けることにします。
あなたは新しいC#6ヌル伝播演算子使用することができますいずれか
:あなたは本当に私が使用する例外をスローする場合、しかし、
myList.Where(x=> x.Property != null && x.Property.Property2 == 5);
:
myList.Where(x=> x.Property?.Property2 == 5);
またはこの単純なアプローチをプレーンループもデバッグが容易です。しかし、我々はあなたがそのような変更などの副作用を作成することができ、クエリ 式に任意のメソッドを呼び出す避けることをお勧めします
https://msdn.microsoft.com/en-us/library/bb513730.aspx
:LINQクエリは、副作用を引き起こすか、例外をスローしてはならないので、これは推奨されますデータソースまたは例外
だから、あなたはすでに(私のfavouriを示してきたforeach
ループのいずれかを投げるの 内容TE)またはtry-catch
:私は例外をスローすることをお勧めしません
List<MyType> myLstResult = null;
try
{
myLstResult = myList.Where(x=> x.Property.Property2 == 5).ToList();
}
catch(NullReferenceException nullref)
{
throw new ArgumentNullException("MyType.Property must not be null", nullref);
}
// ...
Rene has shown別のアプローチ。これはLinq-To-Sql
またはLinq-To-Entities
のようなLINQプロバイダから変換することはできず、前述のガイドラインに違反しています。
更新:多分このようなThrowIfArgumentNull
拡張メソッドに便利です:
public static IEnumerable<TSource> ThrowIfArgumentNull<TSource, TNullable>(this IEnumerable<TSource> enumeration, Func<TSource, TNullable> mightBeNullSelector, string argumentName)
where TNullable : class
{
foreach (TSource item in enumeration)
{
if (mightBeNullSelector(item) == null)
throw new ArgumentNullException(argumentName);
yield return item;
}
}
あなたはこの方法でそれを使用します。
List<MyType> myLstresult = myList
.ThrowIfArgumentNull(x => x.Property, "MyType.Property")
.Where(x => x.Property.Property2 == 5)
.ToList();
私は例外を引き起こすクエリを好きではありません。私は確かにループを好むだろう。_ "ただし、データソースの内容を変更する、または例外をスローするなどの副作用を引き起こす可能性のあるクエリ式では、メソッドを呼び出さないことをお勧めします。**" _ https://msdn.microsoft.com /en-us/library/bb513730.aspx –
@TimSchmelter私は同意しますが、それはOPが求めているものです。 –
@TimSchmelter Wahtは 'myList.Where(x => x.Property ?.Property2 == 5);の問題でした。 –