#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)