EntityFramework: добавьте предложение Where в запрос набора объектов для выбора дочерних атрибутов

#linq #entity-framework-4

#linq #entity-framework-4

Вопрос:

Цель состоит в том, чтобы вернуть список РОДИТЕЛЬСКИХ объектов на основе атрибутов их ДОЧЕРНИХ объектов

например, найдите мне все ЗАМКИ, где LADIES_IN_WAITING принадлежат ПРИНЦЕССЕ «X»

Я хочу сделать что-то вроде этого:

 var query = ObjectSet.Include(c => c.LADIES_IN_WAITING);
query = query.Where(p => p.REGION.ToLower().Contains("shrekVille"));
query = query.Where(p => p.LADIES_IN_WAITING.Where(c => c.PRINCESS.Equals("fiona")));
var results = query.ToList();
  

Очевидно, что это неправильный синтаксис, но я не могу найти никаких четких примеров того, как структурировать запрос.

В настоящее время я прибегаю к чему-то подобному:

 var query = ObjectSet.Include(c => c.LADIES_IN_WAITING);
query = query.Where(p => p.REGION.ToLower().Contains("shrekVille"));

// Get the results from the DB using the query built thus far
var results = query.ToList();

// Now filter the list in memory manually
foreach (var castle in results)
{
    var matchingParents = new List<CASTLE>();
    var matchingChildren = castle.LADIES_IN_WAITING.Where(a => a.PRINCESS.Equals("fiona"));
    if (matchingChildren.Count() > 0) 
        matchingParents.Add(matchingChild);
}
results = matchingParents;
  

Любые предложения о том, как правильно построить запрос, будут приветствоваться!

Ответ №1:

Вероятно, вы хотите использовать Any оператор. Возвращает true, если один элемент в коллекции (т.Е. «Любой» из них) удовлетворяет предикату.

 var query = ObjectSet.Include(c => c.LADIES_IN_WAITING); 
query = query.Where(p => p.REGION.ToLower().Contains("shrekVille")); 

// filter the query where, for each p, 
// any of the LADIES_IN_WAITING have PRINCESS.Equals("fiona") == true
query = query.Where(p => p.LADIES_IN_WAITING.Any(c => 
    c.PRINCESS.Equals("fiona"))); var results = query.ToList(); 
  

Дополнительный оператор All — это оператор, который будет фильтровать ваш запрос по тем результатам, в которых все LADIES_IN_WAITING соответствуют PRINCESS.Equals("fiona") критериям.

Комментарии:

1. @Hellspawn Не стесняйтесь поддержать этот ответ, это было полезно 🙂

2. Извините, Кирк … я пытался, но у меня нет сил! (Для голосования требуется репутация 15)