LinqToSql Фильтр EntitySet - PullRequest
       1

LinqToSql Фильтр EntitySet

0 голосов
/ 17 февраля 2012

Я работаю над приложением WP7, используя Linq To Sql. Я использовал Linq, но это первый раз, когда я использовал Linq для Sql. У меня проблема с фильтрацией данных в EntitySet. Я, возможно, делаю это неправильно, я понятия не имею. То, что у меня есть сейчас, работает, но мне нужно отфильтровать один из наборов EntitySets.

У меня есть 4 таблицы. Таблица связывания Parent, Child, Grandchild и ParentChild. Когда я запрашиваю ParentChild, я возвращаю сущность ParentChild, и я могу отлично перебирать сущности Parent, Child и Grandchild. То, что я хочу сделать, это отфильтровать сущность внука.

Допустим, у меня есть отец и мать за родительским столом. Тогда у меня есть сын и дочь в детском столе. Потом внук и внучка за столом внука. Конечно, есть нормальные ассоциации и т. Д.

Я хочу вернуть отца, который также прекрасно справляется со всеми связанными таблицами. У меня проблема с фильтрацией внуков. Допустим, я хочу просто внука и иметь поле для секса. Как я могу это сделать? Я просто не могу понять это.

Вот код, который я использую, который отлично работает, но тянет всех внуков.

IQueryable<ParentChild> parentChild = from ParentChild c in DataContext.ParentChild
                                              where c.ParentId == this.parentId
                                              select c;

foreach (Grandchild grandchild in parentChild.SelectMany(parent => parent.Child.Grandchild))
{
     Console.WriteLine(grandchild.Name);
}

Так что, если я сделаю это:

IQueryable<ParentChild> parentChild = from ParentChild c in DataContext.ParentChild
                                      where c.ParentId == this.parentId && c.Child.Grandchild.Any(a => a.Sex == "F")
                                      select c;

foreach (Grandchild grandchild in parentChild.SelectMany(parent => parent.Child.Grandchild))
{
     Console.WriteLine(grandchild.Name);
}

У меня есть родитель, но у меня только дети, у которых есть внуки женского пола. Мне нужен родитель, все дети (даже если у них нет внуков-женщин или нет внуков) и только внуки-женщины.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

После долгих проб и ошибок и поисков я нашел ответ.Я должен использовать опцию AssociateWith.

DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.AssociateWith<Child>(c => c.Grandchild.Where(p => p.Sex == "F"));

this.DataContext.LoadOptions = dataLoadOptions;
0 голосов
/ 17 февраля 2012

Пока у вас правильно установлены внешние ключи в SQL; LINQ to SQL сможет предоставить вам свойства ассоциации, которые соответствуют вашим отношениям с внешним ключом.

Если ваши внешние ключи настроены, вы сможете сделать следующее ...

var query = from p in DataContext.Parent            
            //make sure they have at least 1 female grandchild
            where p.GrandChilds.Any(gc => gc.IsFemale)
            select p;

Я сделал несколько предположений об именах в вашей модели данных, но вы поняли идею. : -)

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