Entity Framework - программно добавлять Включает в ObjectQuery - PullRequest
2 голосов
/ 24 декабря 2010

У меня есть модель Entity Framework, где у меня есть пользователь, который имеет следующие отношения:

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();

Я не хочу всегда возвращать курс, связанный с тестом или тестовыми событиями. Как я могу построить ObjectQuery и динамически добавлять операторы Include по мере необходимости, а не иметь серию операторов if else.

1 Ответ

5 голосов
/ 25 декабря 2010

Ну, так как 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.

Дело в том, что ваши методы должны определять, какие включения требуются. Итак, первое, что вы делаете в методе, это объявляете, какие ассоциации требуются, а затем передаете это в свой метод расширения.

Это то, что вы после?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...