我想做一个像这样的简单lambda表达式:
IList<MyEntity1> list = GetSomeList();
MyEntity1 result = list.SingleOrDefault<MyEntityList>(
e => GetMyEntity2(e) != null && GetMyEntity2(e).Id != null && GetMyEntity2(e).Id > 0
);
完美无缺,但从MyEntity1获取MyEntity2并不是那么简单,所以我想在lambda表达式中声明一个变量来保存MyEntity2并使用它,而不是一次又一次地调用GetMyEntity2方法。这可能吗?
注意:代码只是一个反映我真实情况的例子。
谢谢!
答案 0 :(得分:31)
嗯,首先,您是否尝试在linq中使用它来进行sql / entity framework / other?
如果没有,那就这样做
list.SingleOrDefault(e => {
var entity = GetMyEntity2(e);
return entity != null && entity.Id != null && entity.Id > 0;
});
答案 1 :(得分: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();
另请注意,中间的“where”子句可能不是必需的。如果“entity2.Id”是一个可以为空的int,则提升的>
运算符将正确地检查它为空。
答案 2 :(得分: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);
,所以您可以:
{{1}}