我会避免异常。
您既可以使用新的C#6空传播运营商:
myList.Where(x=> x.Property?.Property2 == 5);
或这种简单的方法:
myList.Where(x=> x.Property != null && x.Property.Property2 == 5);
但是,如果你真的想抛出一个异常,我会用一个简单的循环,这也更容易调试。这是建议,因为LINQ查询不应该引起副作用或抛出异常:
https://msdn.microsoft.com/en-us/library/bb513730.aspx
但是,我们建议您不要调用查询 表达的任何方法,可以创建一个副作用,如修改数据源或抛出,你已经展示了一个异常
要不就是foreach
循环的 内容(我favouri 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提供商翻译,如Linq-To-Sql
或Linq-To-Entities
,并违反上述准则。
更新:也许这样的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)的问题;'? –