我有以下表达式:
_callPairs = (from req in _requests
join resp in _responses
on req.RequestId equals resp.RequestId
where !string.IsNullOrEmpty(req.RequestId)
select new CallPair(req, resp)).ToList();
我想改成lambda。我试过了:
_callPairs = _requests.Where(req => (_responses.Where(res => res.RequestId ==
req.RequestId)).Where(!string.IsNullOrEmpty(req.RequestId)).ToList();
不幸的是,这不会编译。
有人可以向我解释我如何将带有连接的linq表达式转换为lambda表达式吗?
答案 0 :(得分:3)
只需使用Join()
方法:
_callPairs = _requests.Where(req => !string.IsNullOrEmpty(req.RequestId))
.Join(_responses,
req => req.RequestId,
resp => resp.RequestId,
(req, resp) => new CallPair(req, resp)).ToList();
答案 1 :(得分:2)
这取决于联接的类型。这里有一个内连接(你可以通过缺少into
子句来判断),因此相应的扩展方法语法正在使用Join
:
_callPairs = _requests
.Where(req => !string.IsNullOrEmpty(req.RequestId))
.Join(_responses, // join to what?
req => req.RequestId, // compare this from requests
resp => resp.RequestId, // to this key from responses
(req, resp) => new CallPair(req, resp)) // create result
.ToList();
对于群组联接(join ... on ... into ...
),您可以使用GroupJoin
代替。