2011-12-16 75 views
2

我不知道在问题的标题中写什么。这是我的样品。我有有酒吧的集合如下一个Foo类:Linq活动子实体的查询

public class Foo 
{ 
    public bool Active {get; set;} 
    public ICollection<Bar> Bars {get; set;} 
} 

public class Bar 
{ 
    public bool Active {get; set;} 
} 

正如你可以看到两个FOOS和酒吧可以设置为不活动(Active = false)。我需要编写一个服务(RIA),它将返回每个活动的Foo及其活动条。
所以这是我到目前为止有:

public IQueryable<Foo> GetFoos() 
{ 
    return ObjectContext.Foos.Where(f => f.Active) 
          .Include("Bars"); 
} 

的事情是,上述查询返回的每一个活动Foo与每一个Bar,让我怎么包括活跃Bars

回答

1

Include方法是LazyLoading的一部分。延迟加载可以是全部或全部,因此您无法告诉EF只加载一些酒吧。

什么,你可以尝试这样做,但是,使用匿名对象作为结果:

context.Foos 
.Where(f => f.Active) 
.Select(f => new { Foo = f, Bars = f.Bars.Where(b => b.IsActive }); 
+0

简单而有效的......非常感谢你! – sebagomez 2012-01-08 16:09:25

1

EF并未如此简单,因为它违背了EF设计工作原理。如果写这个查询很容易,以致每个Foo实体的集合只包含“活动”实体,则每个Foo实体将不是数据库状态的精确模型。另一方面,如果使用投影编写查询(而不是直接检索Foo实体),则具有更大的灵活性。

var query = 
    from f in ObjectContext.Foos 
    where f.Active 
    select new { Foo = f, ActiveBars = f.Bars.Where(b=>b.Active)} 

此时你可以写一个foreach循环与每个Foo实体活动Bar实体重新关联:例如,你可以这样写查询

var results = query.ToList(); 

foreach (var r in results) 
    r.Foo.Bars = r.ActiveBars; 

而且最后在本地执行一个LINQ查询以返回结果:

return (from r in results select r.Foo).ToList(); 

我认为战略我刚刚概述的gy会适用于仅显示的场景,但我会犹豫是否尝试更新以此方式检索的实体。