2011-12-16 73 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會適用於僅顯示的場景,但我會猶豫是否嘗試更新以此方式檢索的實體。