繁体   English   中英

从LINQ结果中删除重复项

[英]Removing Duplicates from LINQ results

我知道必须有一个简单的解决方案。

我有一个类别/子类别树。 类别可以是顶级(没有父类别ID),也可以是子类别(具有父类别ID)。

我的课:

public class Category 
{
    public int CategoryId { get; set; }

    public int WebsiteId { get; set; }

    public Nullable<int> ParentCategoryId { get; set; }
}

我的LINQ:

IList<Category> categories = db.Categories
                               .Where(c => c.WebsiteId == websiteId)
                               .Include(c => c.SubCategories)
                               .ToList();

问题...如果我有以下情况:

  • 第1类
  • 1a类(1类的子类别)
  • 2类
  • 第3类

我在类别列表以及类别1的子类别中获得了类别1a。

我得到这个:

  • 第1类
    • 1a类
  • 1a类//此副本需要删除!
  • 2类
  • 第3类

我试着用一些邪恶的方法来剥离它,这是4种递归方法和70行的Dictionary的构建和剥离,如果有人希望看到它,我可以张贴它(它不起作用)

但是,如果有某种方法可以使LINQ摆脱重复,那将是理想的。

非常感谢!

如果.Include()正在加入子类别,则您应该能够从初始列表中完全过滤掉这些子类别。 具有父类别值的任何内容。 像这样:

db.Categories
  .Where(c => c.WebsiteId == websiteId)
  .Where(c => c.ParentCategoryId == null) // filter sub-categories
  .Include(c => c.SubCategories)
  .ToList();

@David的答案是正确的,但是仅当您的类别结构深一层时才起作用。

下面的代码从数据库中选择一个平面列表,并将其转换为深层对象图。 请注意AsNoTracking()以防止任何更改写回到数据库/操作图的开销。

还要注意,对于大型列表,这会很慢,因为它会执行大量的linq查找等操作,并且还会从数据库中删除整个对象列表。

var categories = db.Categories.AsNoTracking()
    .Where(c => c.WebsiteId == websiteId)
    .ToList();

foreach (var category in categories.Where(c => c.ParentCategoryId.HasValue))
{
    categories.First(c => c.CategoryId == category.ParentCategoryId.Value).SubCategories.Add(category);
}

categories.RemoveAll(c => c.ParentCategoryId.HasValue);
// categories is now a list of top level categories with deeply-nested sub-categories

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM