2012-02-16 2 views
0

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

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

Допустим, у меня есть отец и мать в Родительском столе. Затем у меня есть сын и дочь в таблице «Дети». Потом внук и внучка в таблице Внука. Конечно, есть нормальные ассоциации и т. Д.

Я хочу вернуть отца, который также дает мне все связанные таблицы просто отлично. Проблема в том, что у меня есть фильтрация на 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); 
} 

я родитель, но я получаю только дети, у которых есть женские внуки. Я хочу родителя, всех детей (даже если у них нет женских внуков или нет внуков) и только женских внуков.

ответ

1

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

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

this.DataContext.LoadOptions = dataLoadOptions; 
+0

Это именно то, что я получил после, и вам нужно больше upvotes! – Ian

0

До тех пор, пока ваши внешние ключи правильно настроены в 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; 

Я сделал некоторые предположения относительно имен в DataModel, но вы получите идею. :-)

+0

Спасибо, что доставит меня в правильном направлении. Я ценю это. – vincentw56

+0

Единственное, с чем я сейчас сталкиваюсь, это то, что он тянет грандиозную грандиозность, но только тянет одного ребенка, который связан с внуком. Я хочу удержать отца, всех детей и всех женщин-внуков для всех детей. – vincentw56

Смежные вопросы