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

c# linq lambda

14114 просмотра

3 ответа

Я хочу сделать простое лямбда-выражение вроде этого:

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. Это возможно?

Примечание: код является лишь примером, который отражает мой реальный случай.

Спасибо!

Автор: Diego Источник Размещён: 12.11.2019 09:29

Ответы (3)


32 плюса

Решение

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

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

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

   return entity != null && entity.Id != null && entity.Id > 0;
});
Автор: Darren Kopp Размещён: 15.06.2011 07:52

8 плюса

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

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();

Также обратите внимание, что в среднем предложении «где» может не быть необходимости. Если «entity2.Id» является обнуляемым int, то он будет корректно проверен на нулевое значение >оператором поднял .

Автор: Eric Lippert Размещён: 15.06.2011 08:08

5 плюса

Вы можете использовать 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);
Автор: Kirk Woll Размещён: 15.06.2011 07:55
32x32