3

2 つのフィールドに基づいて重複オブジェクトを見つけようとしていますが、3 番目のフィールドも null の場合のみです

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 クエリで null フィールド値のチェックを行っていることです。

上記の 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()
               };

また、新しい範囲変数を導入して、アイテム数をグループに格納することもできます。次に、アイテム数が 1 回だけ計算されます。

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でグループ化されます

于 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() };

グループ化する前に null 項目のみをフィルタリングし、追加の where 句を使用して重複チェックを行うことができます。

于 2012-11-26T08:54:48.387 に答える