从 IEnumerable<>

问题描述 投票:0回答:1

我有以下结构的复杂实体结构

编辑

enter image description here

这些类别由

IEnumerable<Category>

添加到缓存中

我必须将带有标题的类别层次结构返回到所需语言(例如英语)。

谁能告诉我该怎么做吗?

linq entity-framework
1个回答
0
投票

如果您希望过滤列表并留下 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。但是请仔细考虑您的边界情况。这意味着当您的类别中没有 LanguageID == 1 的 transCategory 时,您很可能会在那里收到一个空的 IEnumerable (不是 100% 确定,但应该是这样,测试一下),并且与该类别的情况相同。子类别.TransSubCategories。因此,最坏的情况是您会得到一个子类别中包含空 IEnumerables 的列表。

我没有在哪里测试它,所以你应该有点怀疑。另外,如果有错误或者您想实现不同的目标,请告诉我。很抱歉无法提供更多帮助


如果您不想更改类别,只需在另一个对象中获取它即可: /* 请注意 IEnumerable 不支持克隆,您无法获取类别的纯副本,但我们可以通过将其作为 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) 方法强制立即执行 查询评估并返回包含查询的列表 结果。您可以将此方法附加到您的查询中以获得 查询结果的缓存副本。

但是,您应该测试我告诉您的内容,因为我还没有地方可以测试它。 希望这对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.