我试图找出如何根据以下情况查询我的实体。
我有两个表,LKCATEGORY和LKSUBCATEGORY,你可以想象这两个表是相互关联的。但是,当我来到一个只需要显示活动类别和子类别的页面时,我该怎么做并拉回LKCATEGORY列表,其中LKSUBCATEGORY包含在参考中,并且这些过滤器都已就位(两个实体上的isActive = true)
我的存储库调用将拉回LKCATEGORY类型的列表,如下所示:
//Create the Entity object
List<LKCATEGORY> category = null;
using (SOAE strikeOffContext = new SOAE())
{
//Invoke the query
category = AdminDelegates.selectCategory.Invoke(strikeOffContext).ByActive(true).ToList();
}
虽然Delegate(selectCategory)看起来像:
public static Func<SOAE, IQueryable<LKCATEGORY>> selectCategory =
CompiledQuery.Compile<SOAE, IQueryable<LKCATEGORY>>(
(category) => from c in category.LKCATEGORY.Include("LKSUBCATEGORY")
select c);
最后是Filter(ByActive)
public static IQueryable<LKCATEGORY> ByActive(this IQueryable<LKCATEGORY> qry, bool active)
{
//Return the filtered IQueryable object
return from c in qry
where c.ACTIVE == active
select c;
}
我意识到我只在LKCATEGORY实体上有过滤器,当然我只会过滤那个表。我的问题是我如何过滤LKCATEGORY和LKSUBCATEGORY并删回包含LKSUBCATEGORY并过滤的LKCATEGORY类型列表?
提前致谢, 比利
答案 0 :(得分:1)
这可能不是您的解决方案,但您可以将其分为两个查询并尝试此操作(我假设这是上下文中LKCATEGORY的第一个操作):
var categories = context.LKCATEGORY.Where(c => c.ACTIVE).ToList();
var subcategories = context.LKSUBCATEGORY.Where(c => c.ACTIVE).ToList();
return categories;
现在看看categories.LKSUBCATEGORY列表,你会发现你只有活跃的列表。
其他解决方案涉及使用linq join
而不是Include
。
修改强>
替代方式:
context.LKCATEGORY.Where(c => c.ACTIVE).Select(c => new { Category = c, Subcategory = c.LKSUBCATEGORY.Where(sc => sc.ACTIVE) }).ToList().Select(a => a.Category);