var ary = (from t1 in listA from t2 in listB where t1.key == t2.key select new { key = t1.key, a = t1.a, b = t1.b, c = t2.c, d = t2.d }).Union(
listA.Where(t => listB.Count(tt => tt.key == t.key) == 0).Select(t => new { t.key, a = t.a, b = t.b, c = 0, d = 0 }).Union(listB.Where(t => listA.Count(tt => tt.key == t.key) == 0).Select(t => new{key=t.key,a=0,b=0,c=t.c,d=t.d})));