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

C#在lambda表达式中声明变量,c#,linq,lambda,C#,Linq,Lambda,我想做一个简单的lambda表达式,如下所示: IList<MyEntity1> list = GetSomeList(); MyEntity1 result = list.SingleOrDefault<MyEntityList>( e => GetMyEntity2(e) != null && GetMyEntity2(e).Id != null && GetMyEntity2(e).Id > 0 ); ILis

我想做一个简单的lambda表达式,如下所示:

IList<MyEntity1> list = GetSomeList();

MyEntity1 result = list.SingleOrDefault<MyEntityList>(
    e => GetMyEntity2(e) != null && GetMyEntity2(e).Id != null && GetMyEntity2(e).Id > 0
);
IList list=GetSomeList();
MyEntity1结果=list.SingleOrDefault(
e=>GetMyEntity2(e)!=null&&GetMyEntity2(e).Id!=null&&GetMyEntity2(e).Id>0
);
这非常有效,但是从MyEntity1获取MyEntity2并不是那么简单,所以我想在lambda表达式中声明一个变量来保存MyEntity2并使用它,而不是一次又一次地调用GetMyEntity2方法。可能吗

注意:代码只是一个反映我真实情况的示例


谢谢

首先,您是否试图在linqtosql/entityframework/other中使用它

如果没有,那么就这样做

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

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

您可以使用
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);
如果要使用“查询理解”语法形式,可以执行以下操作:

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。

是的,这正是我所寻找的,它工作得很好。谢谢谢谢@Kirk Woll,但我找到了easer@Darren Kopp解决方案。这一个比另一个有好处吗?@Diego,在你的例子中,没有那么多。然而,我的解决方案更通用,并且将在LINQtoSQL等环境中工作。(至少,只要您不调用像
GetMyEntity2
这样的自定义方法,就可以了)。它还有“纯功能性”的模糊好处。好的,+1,因为我会考虑@Darren Kopp解决方案不适用的其他情况,谢谢!然而,对于这个案例,我认为我要寻找的答案(也是简单的解决方案)是@Darren的。@Eric Lippert不知道这个语法。但我认为我看到了更清晰、更容易理解的@Darren Kopp解决方案。无论如何谢谢你!关于中间的“where”子句,正如我所说,这只是一个例子,那些不是真正的子句。不过还是要再次感谢你,我不知道我可以比较int?@Eric-你为什么要用多个where而不是一个where和&&@史蒂文:只是因为它看起来不错。顺便说一句,Jon Skeet今天有一篇关于此选择的性能影响的博客文章。它们有点令人惊讶。使用
&&
然后嵌套
where
子句不是更好吗?您可以对它们进行格式化,使其看起来几乎相同,它们更具表现力(“其中x和y”比“其中x和y”更具表现力),并且它们导致运行代码更简单。@configurator:我不认为一种方法比另一种方法更好或更差。
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();