如何使基于实体框架的存储库类对LINQ友好?

如何使基于实体框架的存储库类对LINQ友好?,linq,entity-framework,repository-pattern,Linq,Entity Framework,Repository Pattern,如果我已经用存储库类包装了实体框架数据上下文,那么如何使用LINQ 我想做一些类似的事情: class A { public IRepositiry<T> GetRepository<T>() { DbContextAdapter adapter = new DbContextAdapter(ctx); return new Repository<T>(adapter); } } class B { vo

如果我已经用存储库类包装了实体框架数据上下文,那么如何使用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 ...);
   }
}
A类
{
公共IRepositiry GetRepository()
{
DbContextAdapter=新的DbContextAdapter(ctx);
返回新的存储库(适配器);
}
}
B类
{
无效剂量测定法()
{
A=新的A();
IRepository rep=a.GetRepository();
//在这里做一些linq查询,不知道怎么做。
代表[获取林渠](来自;
}
}

要使您的存储库LINQ友好,您需要在存储库上有一些返回
IQueryable
IEnumerable

因此,在类
存储库
中,您将有如下方法:

public class Repository<T>
{
   DbContextAdapter ctx;

   // other methods omitted

   IEnumerable<Houses> GetHouses()
   {
       return ctx.Houses
   }
}
标准查询运算符允许将查询应用于任何 基于IEnumerable的信息源MSDN


只要编写返回IEnumerable集合的方法,就可以与LINQ兼容

冒着完全懒惰的风险,您想要实现的就是存储库模式,请查看这篇好文章

还可以扩展实体类,以便它们返回自身的实例或列表(单例模式)。又名:

公共部分类FOO:FOO
{
public IEnumerable get愚人(get傻瓜)
{
使用(var context=new FooEntities())
{
return//YOU CODE获取FOO列表
}
}
}

或者类似的东西(代码语法不正确,但应该给你一个大概的想法)。如果您的实体类要实现类似的方法,请将它们抽象到接口契约中,并让您的部分实体类实现该接口。

我认为您是唯一知道什么是
rep.[get Linqu](from意味着。这里有太多的信息缺失。什么是ctx?
IRepositiry
定义了哪些方法?什么是
存储库
?为什么存储库类是通用集合?据我所知,它没有任何好处。我只是根据原始海报提供的示例进行工作。我的目标是让它尽可能接近他的例子,这样答案对他来说就更容易理解了。
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();
  }
}
public partial class FOO : FOO
{
      public IEnumerable<Foo> GetFooList()
      {
           using (var context = new FooEntities())
           {
               return // YOU CODE TO GET LIST OF FOO
           }
       }
}