EntityFramework:将Where子句添加到ObjectSet查询以选择CHILD属性

时间:2011-11-03 10:47:38

标签: linq entity-framework-4

目标是根据其CHILD ENTITIES的属性返回一个PARENT实体列表

例如找到LADIES_IN_WAITING属于PRINCESS'X'的所有CASTLES

我想做这样的事情:

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 个答案:

答案 0 :(得分:1)

您可能想要使用Any operator。如果集合中的一个项(即“其中任何一个”)满足谓词,则返回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,它会将您的查询过滤为 all 符合PRINCESS.Equals("fiona")条件的LADIES_IN_WAITING的结果。

相关问题