linq 从IEnumerable中检索子集< >

jk9hmnmh  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个复杂的实体结构,结构如下

编辑

这些类别由IEnumerable<Category>添加到缓存中
我必须返回的类别层次结构与标题只需要的语言说英语。
谁能告诉我怎么做?

ie3xauqp

ie3xauqp1#

如果您希望过滤列表并留下IEnumerable类别,则:1.至少有一个languageId =“english”的TransCategory 2.如果至少有一个子类别具有至少一个languageId =“english”的TransSubCategory,则:

//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") );

如果您希望保持类别列表不变,但在子类别和转换类别列表中仅保留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中没有一个languageID == 1的transCategory. TransCategegores时,你很可能会在那里收到一个空的IEnumerable(不是100%确定,但应该是这样,测试它),并且category. SubCategories. TransSubCategories也是如此。因此,最坏的情况下,你会得到一个List,子类别中的IEnumerables为空。
我没有在哪里测试它,所以你应该有点怀疑。如果有错误或者你想做一些不同的事情,让我知道。很抱歉没能帮上忙
如果你不想改变你的类别,你只需在另一个对象中得到它:/* 请注意,IEnumerable不支持clone,您无法获得类别的纯副本,但我们可以通过将其作为List调用来获得单独的示例 */

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。可以将此方法附加到查询中,以获取查询结果的缓存副本。
但是你应该测试我告诉你的,因为我还没有地方测试它。希望这能帮助你

相关问题