[英]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。
我得到这个:
我试着用一些邪恶的方法来剥离它,这是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.