C#声明lambda表达式中的变量

我想做一个像这样的简单lambda表达式:

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

这很好用,但从MyEntity1获取MyEntity2并不是那么简单,所以我想在lambda表达式中声明一个变量来保存MyEntity2并使用它,而不是一次又一次地调用GetMyEntity2方法。 那可能吗?

注意:代码只是反映我的实际案例的一个例子。

谢谢!

好吧,首先,你是否想在linq中使用它来实现sql / entity framework / other?

如果没有,那就这样做吧

 list.SingleOrDefault(e => { var entity = GetMyEntity2(e); return entity != null && entity.Id != null && entity.Id > 0; }); 

如果你想使用“查询理解”句法forms,你可以这样做:

 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”是一个可以为null的int,那么它将被提升的>运算符正确地检查为null。

您可以使用Select运算符:

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

或者,因为您在通过GetMyEntity2推送它之后甚至没有使用该Item ,您可能只有:

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