LINQ-to-Entities: условная загрузка вложенных списков - PullRequest
1 голос
/ 23 ноября 2011

У меня есть объект со следующей иерархией

class Account
   string username
   List Delegations

class Delegation
   List SingleDelegations

class SingleDelegation
   string uid

Теперь я хотел бы выполнить запрос, который загружает объект Account с уже загруженными соответствующими зависимостями (т.е. Delegations and Delegations.SingleDelegations)(с этим единственным запросом), , но , он должен загружать только те из них, которые соответствуют указанному условию, а именно

  • только те учетные записи, для которых имя пользователя соответствует параметру (просто)
  • только те SingleDelegation объекты, где uid соответствует заданному параметру

Мой подход
У меня есть следующий метод в моем AccountRepository

public Account ReadAccountsByUsernameAndUid(string username, string uid)
{ 
    var matchingObjs = (from a in context.Accounts
                            from d in a.Delegations
                            from sd in d.SingleDelegations
                            where
                               a.username == username &&
                               sd.uid == uid
                            select new 
                            {
                               Account = a,
                               Delegation = d,
                               SingleDelegation = sd
                            });

     //knowing there should be just one account (ignore the missing null check for now)
    return matchingObjs.FirstOrDefault<Account>().Account;          
}

Это, очевидно, возвращает объект анонимного типа, в котором различные объекты представлены как свойства.Так как Account и Delegation и SingleDelegation связаны через соответствующие FK, мой Account объект будет иметь их должным образом загруженными (поскольку контекст знает их).

Лично это выглядит странно.Мне нужно создать новый анонимный тип для инструктирования EF для включения подобъектов в запрос st. В конце я получаю Account правильно загруженный объект.

Мой вопрос:
Есть ли лучший, более приятный способ?

1 Ответ

2 голосов
/ 23 ноября 2011

Нет, нет лучшего или лучшего способа. Вот как работает EF. Если вы хотите отфильтровать отношения и получить все данные одним запросом, вы всегда должны использовать проекцию.

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