【问题标题】:Entity Framework - Programmatically add Includes to ObjectQuery实体框架 - 以编程方式将包含添加到 ObjectQuery
【发布时间】:2010-12-24 10:32:29
【问题描述】:

我有一个实体框架模型,其中我有一个具有以下关系的用户:

User 1-* Test

每个Test都有以下关系:

Test 1-1 Course
Test 1-* TestEvent

我有一个返回用户的服务,在我的应用程序的不同点我想急切地获取各种关系。我正在获取目前所有的关系:

var result = (from appUser in context.AppUsers.Include("Tests.Course")
    .Include("Tests.TestEvents")
    where appUser.Login.ToLower() == loginName.ToLower() &&
    appUser.IsDeleted == false
    select appUser).FirstOrDefault();

我不想总是返回链接到测试或测试事件的课程。如何构建 ObjectQuery 并根据需要动态添加 Include 语句,而不是使用一系列 if else 语句。

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    好吧,既然Include 返回一个IQueryable<T>(LINQ 可链接),我会使用一个简单的扩展方法:

    public static IQueryable<T> WithIncludes<T>(this IQueryable<T> source, string[] associations)
    {
       var query = (ObjectQuery<T>)source;
    
       foreach (var assoc in associations)
       {
          query = query.Include(assoc);
       }
    }
    

    那么您的查询如下所示:

    var inclusions = new[] { "Tests.Course", "Tests.TestEvents" };
    var result = ctx.AppUsers
                    .WithIncludes(inclusions)
                    .Where(x => x.Login.ToLower() == loginName.ToLower())
                    .Where(x => !x.IsDeleted)
                    .FirstOrDefault();
    

    为了对包含的其他魔术字符串性质进行一些强类型化,我为所有关联提供了专门的枚举,因此我将其中的一个 [] 通过并将枚举转换为字符串 include。

    问题是,您的方法应该定义需要哪些包含。所以你在方法中做的第一件事就是声明需要什么关联,然后将它传递给你的扩展方法。

    这就是你的追求吗?

    【讨论】:

    • 谢谢你 - 我会试试然后回来
    • @Garg Joynes - 没问题,如果您有任何问题,请告诉我。
    • @RPM1984 - 抱歉耽搁了。解决方案很完美,非常感谢。我还使用stackoverflow.com/questions/632434/… 的解决方案以相同的方式处理 Where 子句
    • 很好,这将使我的项目受益匪浅!
    • @MvcCmsJon - 请记住,如果您在新版本的 EF 上,则有强类型 Include,因此不再需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2013-12-25
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多