我有以下结构的实体的复杂结构
修改
这些类别按IEnumberable<Category>
我必须返回类别层次结构,其标题只包含所需的语言,例如英语。
谁能告诉我怎么做?
答案 0 :(得分:0)
如果您希望过滤列表并留下以下类别的IEnumerable: 1.至少有一个TransCategory,带有languageId =&#34; english&#34; 2.至少有一个SubCategory至少有一个TransSubCategory,其中languageId =&#34; english&#34; 然后:
//categories are a IEnumerable<Category> already populated
categories = categories.Where(c => c.TransCategories.Any(ct => ct.LanguageID == "english") ||
c.SubCategories.Any(sc => sc.TransSubCategories.Any(tsc => tsc.LanguageID == "english") );
如果你想保持你的类别列表相同,但是在SubCategories和TransCategories列表中只保留那些有languageId = 1的那些,那么:
foreach (var category in categories)
{
category.TransCategories = category.TransCategories.Where(tc => tc.LanguageID == 1);
foreach (var subCategory in category.SubCategories)
{
subCategory.TransSubCategories = subCategory.TransSubCategores.Where(tsc => tsc.LanguageID == 1);
}
}
这应该过滤掉所有没有languageId == 1的transCategories和transSubCategores。但是要仔细考虑你的边境情况。意思是当你没有在你的category.TransCategores中有一个具有LanguageID == 1的transCategory时,你很可能会收到一个空的IEnumerable(不是100%肯定但它应该是那样,测试它)和类别的相同情况。 SubCategories.TransSubCategories。所以最糟糕的情况是你会在SubCategories中得到一个带有空IEnumebles的List。
我没有在哪里测试它所以你应该有点怀疑。如果有错误或想要实现不同的东西,请告诉我。很抱歉无法提供更多帮助
如果您不想更改类别而不是简单地将其添加到另一个对象中:/ *请注意IEnumerable不支持克隆,您无法获得类别的纯副本,但我们可以通过将其称为单独的实例来获取它列表* /
var userCategories = categories.ToList();
foreach (var category in userCategories)
{
category.TransCategories = category.TransCategories.Where(tc => tc.LanguageID == 1);
foreach (var subCategory in category.SubCategories)
{
subCategory.TransSubCategories = subCategory.TransSubCategores.Where(tsc => tsc.LanguageID == 1);
}
}
所以这应该在userCategories中有你想要的结果,而类别将保持不变。您还应该记住,如果您正在使用IQueryable等,调用.ToList()将枚举您的对象。 从MSDN引用:
ToList(IEnumerable)方法强制立即执行 查询评估并返回包含查询的List 结果。您可以将此方法附加到查询中以获取 缓存的查询结果副本。
但是你应该测试我告诉你的内容,因为我还没有地方测试它。 希望这可以帮助你