实体框架查询

时间:2010-02-16 18:16:00

标签: database entity-framework

我试图找出如何根据以下情况查询我的实体。

我有两个表,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类型列表?

提前致谢, 比利

1 个答案:

答案 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);