我是SQL和LINQ的新手。我尝试了一个简单的代码,使用join...into
语法将两个列表连接起来,但是结果却出乎我的意料。
public static void Main(string[] args)
{
IEnumerable<KeyValuePair<char,int>> list1 = new []{
new KeyValuePair<char,int>( 'a', 1) ,
new KeyValuePair<char,int>( 'b', 2) ,
new KeyValuePair<char,int>( 'c', 3) };
IEnumerable<KeyValuePair<char, int>> list2 = new[]{
new KeyValuePair<char,int>( 'b', 10) ,
new KeyValuePair<char,int>( 'c', 20) ,
new KeyValuePair<char,int>( 'd', 30) };
var joinQuery = from x in list1
join y in list2
on x.Key equals y.Key into joinTable
from t in joinTable
select new { element = t };
foreach (var el in joinQuery)
Console.WriteLine(el);
}
输出为:
{ element = [b, 10] }
{ element = [c, 20] }
我期望joinTable
包含联接记录,例如:
{element = {[b, 2], [b, 10]}}
{element = {[c, 3], [c, 20]}}
您能解释一下... into joinTable
这部分实际上做了什么,为什么我可以在最后一次选择中使用x
而不能使用y
:
var joinQuery = from x in list1
join y in list2
on x.Key equals y.Key into joinTable
from t in joinTable
select new { element = t,
first = x, // OK
second = y} // Error: The name y doesn't exist in the current context
答案 0 :(得分:0)
如果我理解正确,那么您基本上是在尝试从键1匹配的列表1和列表2获取所有信息。如果是这样,您可以这样做:
var joinQuery = from x in list1
join y in list2
on x.Key equals y.Key
select new
{
first = x,
second = y
};
您无需将其添加到任意表中,只需从联接结果中选择即可。
答案 1 :(得分:0)
根据Jon Skeet's blog,join ... into
语法被转换为GroupJoin()
,而不是您期望的Join
。
但是您真正想要的是一个真正的联接,就像这样:
var joinQuery = from x in list1
join y in list2
on x.Key equals y.Key
select new { x, y };
在您的查询中,您无法访问y
,因为join into
的语法不同。您不需要其他from... joinTable
,而必须直接访问joinTable
:
var joinQuery = from x in list1
join y in list2
on x.Key equals y.Key into joinTable
select new {joinTable.x, matches = joinTable.y.ToList()};
但这将导致y
具有list2
中所有匹配的元素。这就是Join
(每个匹配元素导致一个“行”)和GroupJoin
(匹配项分组在一起)之间的区别。