3

我正在尝试根据 2 个字段定位重复对象,但仅在第 3 个字段也为空的情况下

ItemNumber, Name, Pricebook, Parent
Item1, A, B, <null>
Item2, A, B, Item1
Item3, A, B, <null>
Item4, A, B, Item1
Item5, A, B, Item2

所以在上面的列表中,只有 2 个重复项实际上是 Item1 和 Item3

var duplicateItemsList =
    from i in items
    group i by new { i.ItemNumber, i.Pricebook, i.Parent } into d
    where d.Count() > 1
    select new { ItemNumber = d.Key.ItemNumber, Pricebook = d.Key.Pricebook, Parent = d.Key.Parent, Count = d.Count() };

我遇到的麻烦是检查 Linq 查询中的空字段值。

在上面的 Linq 查询之后,我只想得到一个包含重复的 ItemNumber 和 Pricebook 字段值的列表。

4

2 回答 2

3

我认为您Parent在结果和摸索键中不需要属性,因为它具有null价值。此外,如果匿名对象与分配的属性名称相同,则不需要指定属性名称。

var duplicateItemsList =
    from i in items
    where i.Parent == null
    group i by new { i.Name, i.Pricebook } into d
    where d.Count() > 1
    select new { 
                  d.Key.Name, 
                  d.Key.Pricebook, 
                  Count = d.Count()
               };

您还可以引入新的范围变量来存储组中的项目计数。然后项目计数将只计算一次:

var duplicateItemsList =
    from i in items
    where i.Parent == null
    group i by new { i.Name, i.Pricebook } into d
    let groupItemsCount = d.Count()
    where groupItemsCount > 1
    select new { 
                  d.Key.Name, 
                  d.Key.Pricebook, 
                  Count = groupItemsCount
               };

正如@Blachshma指出的那样更新,您按 ItemNumber 而不是 Name 分组

于 2012-11-26T08:54:56.580 回答
2
var duplicateItemsList =
    from i in items
    where i.Parent == null
    group i by new { i.ItemNumber, i.Pricebook, i.Parent } into d
    where d.Count() > 1
    select new { ItemNumber = d.Key.ItemNumber, Pricebook = d.Key.Pricebook, Parent = d.Key.Parent, Count = d.Count() };

您可以在分组之前仅过滤空项目,并使用附加的 where 子句进行重复检查。

于 2012-11-26T08:54:48.387 回答