First () сгенерирует исключение, если коллекция пуста.Использование Any () в вашем вызове Where()
действительно должно решить проблему, но вам придется написать что-то вроде:
data.Where(d => d.ObjectsA != null && d.ObjectsA.Any()
&& d.ObjectsA.First().ObjectsB != null && d.ObjectsA.First().ObjectsB.Any()
&& d.ObjectsA.First().ObjectsB.First().Nr == 1);
Это не очень хорошо, потому что First()
заканчиваетсявызывается несколько раз на одних и тех же данных.Я бы предложил добавить тело к вашему лямбда-выражению и использовать промежуточные переменные с FirstOrDefault () :
data.Where(d => {
if (d.ObjectsA != null) {
var firstA = d.ObjectsA.FirstOrDefault();
if (firstA != null && firstA.ObjectsB != null) {
var firstB = firstA.ObjectsB.FirstOrDefault();
if (firstB != null) {
return (firstB.Nr == 1);
}
}
}
return false;
});
РЕДАКТИРОВАТЬ: Второй фрагмент кода выше, очевидно, делаетне работает с LINQ для NHibernate.Если вы можете использовать синтаксис запроса и вам не нужно проверять, являются ли ObjectsA
и ObjectsB
null
, вы можете написать:
from d in data
let firstA = d.ObjectsA.FirstOrDefault()
let firstB = (firstA != null ? firstA.ObjectsB.FirstOrDefault() : null)
where (firstB != null && firstB.Nr == 1)
select d;