0

我有 2 个不同类型的数组,一个来自文件,一个来自 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);

我已经尝试过这些,但它们似乎只是退回了所有物品。我该怎么做呢?

4

1 回答 1

2

使用Enumerable.Except

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);
于 2013-07-23T10:29:12.277 回答