如何将跨表的外连接表达为单个 Linq 表达式
以下情况: 存在一个充当交叉表(mergeSet)的数组。另外还有 存在一组目标值和一组源值。源值 可以通过交叉表与目标值连接。 -但这怎么可能 通过使用来表达目标集与其他表的外连接 只有一个 LINQ 表达式?
目前我只找到使用多个 LINQ 的解决方案 表达式(即 targetSet+mergeSet+sourceSet 的内部联接,然后是纯 左外部部分,最后是innerJoinResult 和outerPart 的串联)。
var mergeSet = new[]
{
new KeyValuePair<int, int>(3, 4),
new KeyValuePair<int, int>(5, 6)
};
var targetSet = new[] { 1, 3, 5, 7 };
var sourceSet = new[] { 4, 6 };
var innerJoinResult =
from mergeItem in mergeSet
join sourceItem in sourceSet on mergeItem.Value equals sourceItem
join targetItem in targetSet on mergeItem.Key equals targetItem
group sourceItem by targetItem;
var outerPart =
from targetItem in targetSet
where !mergeSet.Any(mergeItem => mergeItem.Key == targetItem)
group 0 by targetItem; // Fill the right part with zero.
var outerJoinResult = outerPart.Concat(innerJoinResult);
Following situation:
There exists an array acting as crosstable (mergeSet). Additionally there
exists a set of target values and a set of source values. The source values
can be joined with the target values via the crosstable. - But how is it possible
to express an outer join of, e.g., the targetSet against the other tables by using
only one LINQ expression?
Currently I found only solutions using multiple LINQ
expressions (i.e. an inner join of targetSet+mergeSet+sourceSet, then the pure
left outer part and finally a concatenation of the innerJoinResult and the outerPart).
var mergeSet = new[]
{
new KeyValuePair<int, int>(3, 4),
new KeyValuePair<int, int>(5, 6)
};
var targetSet = new[] { 1, 3, 5, 7 };
var sourceSet = new[] { 4, 6 };
var innerJoinResult =
from mergeItem in mergeSet
join sourceItem in sourceSet on mergeItem.Value equals sourceItem
join targetItem in targetSet on mergeItem.Key equals targetItem
group sourceItem by targetItem;
var outerPart =
from targetItem in targetSet
where !mergeSet.Any(mergeItem => mergeItem.Key == targetItem)
group 0 by targetItem; // Fill the right part with zero.
var outerJoinResult = outerPart.Concat(innerJoinResult);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如下代码:
打印:
The following code:
printed: