我有三个类型MyObject
的A,B和C列表。我需要根据一个公共密钥获得A,B和C之间交集的列表:
public class MyObject
{
public MyObject(string key)
{
Key = key;
}
public string Key { get; set; }
}
var listA = new List<MyObject>
{
new MyObject("1"),
new MyObject("2")
};
var listB = new List<MyObject>
{
new MyObject("1"),
new MyObject("2"),
new MyObject("3")
};
var listC = new List<MyObject>
{
new MyObject("1"),
new MyObject("2"),
new MyObject("3")
};
var query = (from b in listB
join c in listC on b.Key equals c.Key
join a in listA on c.Key equals a.Key
select new { a, b, c}
);
var result = query.ToList();
工作正常,它会返回如下列表:
[0]: {a.Key = 1, b.Key = 1, c.Key = 1}
[1]: {a.Key = 2, b.Key = 2, c.Key = 2}
现在,我需要的是b和c之间的交集,但是包含非匹配a的空值:
[0]: {a.Key = 1, b.Key = 1, c.Key = 1}
[1]: {a.Key = 2, b.Key = 2, c.Key = 2}
[2]: {null, b.Key = 3, c.Key = 3}
我不想包含null b或c。只有null a。我尝试使用DefaultIfEmpty()
扩展方法像左外连接一样,但是没有用。有关如何修改上述查询以获得预期结果的任何建议?
谢谢,
答案 0 :(得分:2)
只需对a
使用“左连接”:
var query = (from b in listB
join c in listC on b.Key equals c.Key
join a in listA on c.Key equals a.Key into ca // this will include c's with no matching a's.
from ac in ca.DefaultIfEmpty()
select new { a = ac, b, c} // ac will be null if no a is found
);