2

我正在使用返回重复 ID 的 API。我需要使用 EF 将这些值插入到我的数据库中。在尝试添加对象之前,我想修剪掉所有重复项。

我有一个我正在尝试编写的代码的小例子。

  var itemsToImport = new List<Item>(){};
        itemsToImport.Add(new Item() { Description = "D-0", Id = 0 });            
        for (int i = 0; i < 5; i++)
        {
            itemsToImport.Add(new Item(){Id = i,Description = "D-"+i.ToString()});
        }

        var currentItems = new List<Item>
                        {
                            new Item() {Id = 1,Description = "D-1"},
                            new Item(){Id = 3,Description = "D-3"}
                        };
        //returns the correct missing Ids
        var missing = itemsToImport.Select(s => s.Id).Except(currentItems.Select(s => s.Id));


        //toAdd contains the duplicate record. 
        var toAdd = itemsToImport.Where(x => missing.Contains(x.Id));
        foreach (var item in toAdd)
        {
            Console.WriteLine(item.Description);
        }

即使有重复,我需要更改什么来修复我的变量“toAdd”以仅返回一条记录?

4

3 回答 3

3

您可以通过按 Id 分组,然后选择每个组中的第一项来执行此操作。

var toAdd = itemsToImport
              .Where(x => missing.Contains(x.Id));

变成

var toAdd = itemsToImport
              .Where(x => missing.Contains(x.Id))
              .GroupBy(item => item.Id)
              .Select(grp => grp.First());
于 2012-05-16T05:22:57.797 回答
2

按照 Jon Skeet 在 https://stackoverflow.com/a/2298230/385844中的建议,使用来自MoreLINQ的 DistinctBy

调用看起来像这样:

var toAdd = itemsToImport.Where(x => missing.Contains(x.Id)).DistinctBy(x => x.Id);

如果您出于某种原因不想(或不能)使用 MoreLINQ,DistinctBy 很容易自己实现:

static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> sequence, Func<T, TKey> projection)
{
    var set = new HashSet<TKey>();
    foreach (var item in sequence)
        if (set.Add(projection(item)))
            yield return item;
}
于 2012-05-16T05:41:34.630 回答
0

您可以使用该Distinct功能。不过,您需要覆盖Equalsand GetHashCodein Item(假设它们包含相同的数据)。

或用于FirstOrDefault获取具有匹配 Id 的第一个项目。

itemsToImport.Where(x => missing.Contains(x.Id)).FirstOrDefault() 
于 2012-05-16T05:22:45.853 回答