2012-02-24 18 views
0

如果我已經用存儲庫類包裝實體框架數據上下文,我該如何使用LINQ?如何使基於實體框架的存儲庫類LINQ友好?

我想要做的事,如:

class A 
{ 
    public IRepositiry<T> GetRepository<T>() 
    { 
     DbContextAdapter adapter = new DbContextAdapter(ctx); 
     return new Repository<T>(adapter); 
    } 
} 

class B 
{ 
    void DoSomething() 
    { 
     A a = new A(); 
     IRepository<House> rep = a.GetRepository<House>(); 

     // Do some linq queries here, don't know how. 
     rep.[get Linqu] (from ...); 
    } 
} 
+0

我認爲你是唯一知道'代表[得到臨]](從......)'的人的手段。 – 2012-02-24 12:31:55

+0

這裏有很多缺失的信息。什麼是'ctx'? 'IRepositiry '定義了哪些方法?什麼是「存儲庫」? – Yuck 2012-02-24 16:49:10

回答

0

你的倉庫LINQ友善,你需要有一些關於它的方法或屬性返回IQueryable<T>IEnumerable<T>

於是在課上Repository<T>你會一個這樣的方法:

public class Repository<T> 
{ 
    DbContextAdapter ctx; 

    // other methods omitted 

    IEnumerable<Houses> GetHouses() 
    { 
     return ctx.Houses 
    } 
} 

然後在DoSomething你可以這樣做:

void DoSomething() 
{ 
    A a = new A();  
    IRepository<House> rep = a.GetRepository<House>();  

    var q = from house in rep.GetHouses() 
      where house.Color = "Purple" 
      select house; 

    foreach(var h in q) 
    { 
    house.SetOnFire(); 
    } 
} 
+0

爲什麼您的存儲庫類是一個通用集合?據我所知,它沒有任何好處。 – BentOnCoding 2012-02-24 16:59:29

+1

我剛剛從原始海報提供的例子中工作。我的目標是儘可能接近他的榜樣,這樣他的理解就會更容易。 – 2012-02-24 17:30:19

+0

這很有道理。 – BentOnCoding 2012-02-24 18:03:45

0

標準查詢操作符允許查詢被應用於任何基於 IEnumerable的信息源。 - MSDN

只要您編寫返回IEnumerable集合的方法,您將與LINQ兼容。

0

冒着完全懶惰的風險,你想要實現的就是知識庫模式,檢出Huyrya作爲它的一篇好文章。

也可以擴展實體類,以便它們返回自己的實例或列表(單例模式)。又名:

public partial class FOO : FOO 
{ 
     public IEnumerable<Foo> GetFooList() 
     { 
      using (var context = new FooEntities()) 
      { 
       return // YOU CODE TO GET LIST OF FOO 
      } 
     } 
} 

或類似的東西(代碼語法不正確,但應該給你的一般想法)。如果您的實體類將要實現類似的方法,請將它們抽象爲接口契約並讓您的部分實體類實現該接口。