Подтвердить что ты не робот

С# Объявить переменную в выражении лямбда

Я хочу сделать простое выражение лямбда следующим образом:

IList<MyEntity1> list = GetSomeList();

MyEntity1 result = list.SingleOrDefault<MyEntityList>(
    e => GetMyEntity2(e) != null && GetMyEntity2(e).Id != null && GetMyEntity2(e).Id > 0
);

Это работает отлично, но получение MyEntity2 из MyEntity1 не так просто, поэтому я хотел бы объявить переменную в выражении лямбда для сохранения MyEntity2 и использовать ее вместо того, чтобы снова и снова звонить методу GetMyEntity2. Возможно ли это?

Примечание. Код - это просто пример, который отражает мой реальный случай.

Спасибо!

4b9b3361

Ответ 1

Ну, во-первых, пытаетесь ли вы использовать это в linq для sql/entity framework/other?

Если нет, то просто сделайте это

list.SingleOrDefault(e => {
   var entity = GetMyEntity2(e);

   return entity != null && entity.Id != null && entity.Id > 0;
});

Ответ 2

Если вы хотите использовать синтаксическую форму "понимание запроса", вы можете сделать это:

var query = from entity1 in list
            let entity2 = GetMyEntity2(entity1)
            where entity2 != null
            where entity2.Id != null 
            where entity2.Id > 0
            select entity1;
var result = query.SingleOrDefault();

Обратите также внимание, что среднее предложение "where" может не понадобиться. Если "entity2.Id" является нулевым int, тогда он будет корректно проверен на нуль при поднятом операторе >.

Ответ 3

Вы можете использовать оператор Select:

IList<MyEntity1> list = GetSomeList();

MyEntity1 result = list
    .Select(x => new { Item = x, Entity2 = GetMyEntity2(x) })    
    .SingleOrDefault(x => x.Entity2 != null && x.Entity2.Id != null && x.Entity2.Id > 0);

Или, поскольку вы даже не используете Item после нажатия GetMyEntity2, вы можете просто:

MyEntity1 result = list
    .Select(x => GetMyEntity2(x))    
    .SingleOrDefault(x => x != null && x.Id != null && x.Id > 0);