我有两个不同类型的数组,一个来自文件,一个来自SQL数据库 - LINQ to SQL。我正在尝试从我的数据库中删除通过该文件收到的项目中的非匹配项目。 (我提到这个以防万一有更有效的方法去做我想要实现的目标)。
我已经起草了几个匿名数组来展示我想要做的事情:
var a = new[] {
new { code = "A", subid = 1, test = "dunno" }, new { code = "A", subid = 2, test = "dunno" }, new { code = "A", subid = 3, test = "dunno" },
new { code = "B", subid = 1, test = "dunno" }, new { code = "B", subid = 2, test = "dunno" }, new { code = "B", subid = 3, test = "dunno" }
};
var c = new[] {
new { code = "A", subid = 1 }, new { code = "A", subid = 2 },
new { code = "B", subid = 1 }, new { code = "B", subid = 2 }
};
我需要它来返回不匹配的项目,例如new { code = "A", subid = 3 }
和new { code = "B", subid = 3 }
var b = (from items in a
where c.Any(d => d.code == items.code && d.subid != items.subid)
select items);
和
var b = (from items in a
where c.Where(d=> d.code == items.code).Any(d => d.subid != items.subid)
select items);
我尝试了这些,但他们似乎只是返回所有项目。我该怎么做?
答案 0 :(得分:2)
var nonMatchingItems = a.Except(c);
完整样本:
var a = new[] {
new { code = "A", subid = 1 },
new { code = "A", subid = 2 },
new { code = "A", subid = 3 },
new { code = "B", subid = 1 },
new { code = "B", subid = 2 },
new { code = "B", subid = 3 }
};
var c = new[] {
new { code = "A", subid = 1 },
new { code = "A", subid = 2 },
new { code = "B", subid = 1 },
new { code = "B", subid = 2 }
};
foreach(vat item in a.Except(c))
Console.WriteLine(item);
// { code = A, subid = 3 }
// { code = B, subid = 3 }
更新(如果您有不同的类型,并希望找到某些字段集的匹配项,那么请使用序列连接,并从a
中删除所有匹配某些项目的项目c
:
var matchingItems = from aa in a
join cc in c
on new { aa.code, aa.subid } equals // properties subset
new { cc.code, cc.subid } // same subset
select aa; // select inner item from join
var nonMatchingItems = a.Except(matchingItems);