Entity Framework - Как отфильтровать отношения EntityCollection - PullRequest
2 голосов
/ 24 августа 2011

У меня следующая структура таблицы:

Таблица A, Таблица B, Таблица C и Таблица D, где

A 1..* B
A 1..* C
C 1..* D

Для начала я хотел, чтобы все данные были возвращены (через службу WCFпоэтому не ленивая загрузка) так что это был оригинальный код:

var a = (from a in context.As.Include("Bs").Include("Cs.Ds")
         where a.Id = paramId
         select a).SingleOrDefault();

Возвращает объект A с объектами EntityCollections из Bs и Cs и C, каждый из которых имеет EntityCollection из Ds

Однако оба Bи C имеет флаг IsActive, и теперь я хочу возвращать только те B и C, где Active.

Я знаю, что теперь я не могу использовать .Include, поскольку это всегда будет возвращать всю коллекцию.

После некоторого поиска в Google, пока у меня есть:

var query = (from a in context.As
            where a.Id = paramId
            select new
                {
                    A = a, 
                    Bs = from b in a.Bs where b.IsActive select b, 
                    Cs = from c in a.Cs where c.IsActive select c
                }).SingleOrDefault();

Это лучший способ сформировать запрос?

Затем я преобразовываю анонимный тип в объект A:

var a = query.A;

foreach (var b in query.Bs)
{
    a.Bs.Add(b);
}

foreach (var c in query.Cs)
{
    a.Cs.Add(c);
}

Это лучший способ объединить As, B и C в A с EntityCollections?

Как мне также получить D в качестве коллекции для каждого C?

1 Ответ

1 голос
/ 24 августа 2011

Насколько я знаю, вы не можете отфильтровать включенные объекты: как только вы напишите включение, вы получите все связанные объекты.

Один из подходов состоит в том, чтобы выбрать связанные сущности в разных коллекциях и отслеживать их отдельно.

С другой стороны, вы можете включить связанные коллекции и применить фильтрацию при их использовании.

Обратите внимание, что у вашего текущего подхода есть недостаток: Ваши вновь созданные объекты отключены от контекста. Это означает, что вы отключаете возможности самоконтроля при их использовании.

...