实体框架 - 以编程方式将包含添加到ObjectQuery

时间:2010-12-24 10:32:29

标签: entity-framework-4

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

User 1-* 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();

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

1 个答案:

答案 0 :(得分:5)

好吧,既然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的魔术字符串中加入一些强类型,我有所有关联的专用枚举,所以我传递了一些[]并将枚举转换为字符串include。

问题是,您的方法应该定义所需的内含物。因此,您在方法中首先要做的是声明需要哪些关联,然后将其传递给您的扩展方法。

那是你的追求吗?