如何在LINQ中使用Distinct进行此选择查询

时间:2014-12-04 06:52:32

标签: c# asp.net linq distinct

我有以下查询:

var query = from product in SH_Products
        from product_group in SH_ProductGroups_Products.Where(c=>c.ProductID == product.ID)
        from manufacturer in SH_Manufacturers.Where(c=>c.ID == product.ManufactureID)   
        from attributeOption_product in SH_AttributeOptions_Products.Where(c=>c.ProductID == product.ID).DefaultIfEmpty()
        where !product.IsDeleted
        && !product_group.IsDeleted
        && !manufacturer.IsDeleted
        && product.Status != 0  
        select new
        {
            product.ID,   
            ProductGroupID = product_group.ProductGroupID,
            AttributeOptionID = (int?)attributeOption_product.AttributeOptionsID,
            product.ManufacturerID
        };
query.Distinct().Dump();

以下是示例输出:

ID    ProductGroupID    AttributeOptionID    ManufacturerID
1     1                 75                   1
1     1                 76                   1
2     3                 17                   2
3     2                 3                    1
4     1                 NULL                 1

如你所见,我们有ID = 1的2条记录,我不想这样,我怎么能删除这张呢?

我为我的项目的过滤部分写了这个查询。 我按ProductGroupIDAttributeOptionIDManufacturerID进行了过滤,所有这些都是多选的!

谢谢!

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,您可以使用Distinct扩展方法的其他重载来请求EqualityComparer

或者您可以使用其他方式

query.GroupBy(item => item.ID).Select(grp => grp.First())...

而不是

query.Distinct()...

请不要忘记输出不包含样本输出中的第二条记录。

如果您的记录的密钥不仅仅是ID,而是IDProductGroupID,那么使用情况可以

query.GroupBy(item => new {item.ID, item.ProductGroupId} ).Select(grp => grp.First())...