从IEnumerable<>中检索子集

时间:2014-08-05 13:43:01

标签: linq entity-framework

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

修改

enter image description here 这些类别按IEnumberable<Category>

添加到缓存中

我必须返回类别层次结构,其标题只包含所需的语言,例如英语。

谁能告诉我怎么做?

1 个答案:

答案 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   结果。您可以将此方法附加到查询中以获取   缓存的查询结果副本。

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

相关问题