Могу ли я использовать FirstOrDefault () или First () внутри Where () - PullRequest
2 голосов
/ 29 апреля 2011

Я пытаюсь реализовать этот запрос:

 data.Where(d => d.ObjectsA != null && 
   d.ObjectsA.First().ObjectsB != null && 
   d.ObjectsA.First().ObjectsB().First().Nr == 1)

в Nhibernate.Linq, но у меня есть ошибка.Когда я удаляю First () из Where (), все работает.Я пробую это решение, но это не дает того, что мне нужно.

 data.Where(d => d.ObjectsA.Where(a.ObjectsB.Where(b=>b.Nr == 1).Any()).Any());

Могу ли я использовать FirstOrDefault () или First () внутри Where ()?

РЕДАКТИРОВАТЬ: В моих таблицах БДвсе строки в этом примере не имеют нулевых значений.

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

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;
1 голос
/ 01 сентября 2012

Если коллекции, используемые в условии, могут быть пустыми, вы можете использовать переменную по умолчанию и ??Нулевой оператор с FirstOrDefault ().

var defaultA = new ObjectA();
var defaultB = new ObjectB();
var defaultBList = new List<ObjectB>();

data.Where(d => d.ObjectsA != null && 
   ((d.ObjectsA.FirstOrDefault() ?? defaultA).ObjectsB ?? defaultBList)
   .FirstOrDefault() ?? defaultB).Nr == 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...