Linq выбирает родителя на основе дочерних критериев - PullRequest
4 голосов
/ 11 августа 2011

Общая картина:

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

Я пытаюсь создать метод расширения для Iqueryable<Parent>, чтобы я мог использовать его как часть "цепочки".

Методподпись (на данный момент):

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry, int[]  childrenIDs)

Родительская таблица и дочерняя таблица:

Parent
  ParentID
  Name
  Description

Child
  ParentID (FK)
  AnotherID (from a lookup table)

Selection criteria:
int[] ids = new int[3] {1,2,3}; 

Использование будет примерно таким:

var parents = repository.All() //returns Iqueryable<Parent>
public IQueryable<Parent> Search(Search seach){
   if (search.Criteria1 != null){
      parents = parents.FilterByFirstCriteria(search.Criteria1);
   }
   if (search.ChildrenIDs != null){ //ChildrenIDs is an int[] with values 1,2,3
      parents = parents.ContainsChild(search.ChildrenIDs)
   }
}

Я пытаюсь понять, как создать метод ContainsChild, который возвращает IQueryable<Parent>, где у родителей есть хотя бы один ребенок с AnotherID в массиве ids.

(I 'я пытаюсь использовать EF4 для достижения этой цели)

Любая помощь полностью оценена.

1 Ответ

11 голосов
/ 11 августа 2011

Возможно, это:

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry,
   int[] childrenIDs)
{
   return qry.Where(p => p.Children.Any(c => childrenIDs.Contains(c.AnotherID)));
}

Редактировать

Просто для развлечения другой способ, который должен дать тот же результат:

public static IQueryable<Parent> ContainsChild(this IQueryable<Parent> qry,
   int[] childrenIDs)
{
   return qry.Where(p => p.Children.Select(c => c.AnotherID)
                                   .Intersect(childrenIDs).Any());
}

Сгенерированный SQL для первой версии выглядит более дружелюбным, поэтому я бы предпочел первую версию.

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