Используйте LINQ-to-SQL, чтобы вернуть объект с отфильтрованными дочерними объектами. - PullRequest
2 голосов
/ 29 августа 2011

У меня есть таблица MembershipGroups, связанная с дочерней таблицей Members.В таблице «Члены» есть столбец «Состояние», который можно установить как «Активный» или «Неактивный».

Я хочу выбрать все членские группы и только их активных участников

Например,

Членские группы

ID ---- Название

1 ----- Группа № 1

2 ----- Группа № 2

Участники

MembershipGroupID-Name - Status

1 ------------------------- Джон ---- Активный

1 ------------------------- Салли ---- Неактивный

1 ------------------------- Дэвид --- Неактивен

Я пытаюсь создать запросэто выглядит примерно так (что в настоящее время не работает):

var query = from mg in db.MembershipGroups
where mg.Members.Status = "Active"
select mg

Результат для этого примера должен возвращать членскую группу ID # 1 только с одним дочерним элементом Member

Howможно использовать LINQ-to-SQL для выбора родительского объекта, который фильтрует дочерние объекты?Если бы я использовал прямой T-SQL, то это было бы простым соединением с предложением where, но с помощью LINQ-to-SQL сделать это было бы гораздо сложнее.

Ответы [ 3 ]

3 голосов
/ 29 августа 2011

Редактировать - Обновленный ответ для возврата объекта MemberShipGroup

var query = (from mg in db.MembershipGroups
            join m in db.Members.Where(mem => mem.Status == "Active")
            on mg.ID equals m.MembershipGroups into members
            select new
            {
               MembershipGroup = mg,
               Members = members
            }).AsEnumerable()
              .Select(m => new MembershipGroup  
                           {
                             ID = m.MembershipGroup.ID,
                             Title = m.MembershipGroup.Title,
                             Members = m.Members 
                           });
1 голос
/ 30 августа 2011

В LINQ to SQL вы можете использовать метод AssociateWith в DataLoadOptions, чтобы установить ваш дочерний фильтр на уровне контекста.

DataLoadOptions opt = new DataLoadOptions();
opt.AssociateWith<Member>(m => m.Status == "Active");
db.LoadOptions = opt;

Имея это, вы можете просто вернуть свои группы участников (или отфильтровать их для активных, используя where mg.Any(group => group.Members.Status == "Active"). Затем, когда вы попытаетесь углубиться в членов этой группы, только активныеони будут возвращены из-за LoadOptions.

См. также http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.associatewith.aspx. Одно слово предупреждения: после установки LoadOptions для экземпляра контекста его нельзя изменить. Возможно, вы захотите использоватьнастраиваемый контекст для использования этой опции.

В качестве альтернативы вы можете использовать модель наследования LINQ to SQL для создания типа ActiveMember, используя столбец Status в качестве распознавателя, а затем создать связь между типами MemberGroups и ActiveMembers.Это тот подход, который вам необходимо использовать для моделирования этого с помощью Entity Framework, если вы, несмотря на то, что идете по этому маршруту, а также EF не поддерживает концепцию LoadOptions.

0 голосов
/ 29 августа 2011

Убедитесь, что вы включаете дочерние объекты, которые вы пытаетесь отфильтровать, внутри запроса.

* 1003 Е.Г. *

var query = db.MembershipGroups .INCLUDE ( "Участники") .Where (m => m.Members.Status == "Active");

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