Как сделать мой класс репозитория на основе Entity Framework дружественным LINQ? - PullRequest
0 голосов
/ 24 февраля 2012

Как я могу использовать LINQ, если я обернул свой контекст данных Entity Framework классом Repository?

Я хочу сделать что-то вроде:

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 ...);
   }
}

Ответы [ 3 ]

0 голосов
/ 24 февраля 2012

Стандартные операторы запросов позволяют применять запросы к любому источнику информации на основе IEnumerable.- MSDN

Пока вы пишете методы, возвращающие коллекции IEnumerable, вы будете совместимы с LINQ.

0 голосов
/ 21 мая 2012

рискуя быть полностью ленивым, то, что вы хотите реализовать, называется шаблоном хранилища, зацените Huyrya как хорошую статью.

Также возможно расширить классы сущностей, чтобы они возвращали экземпляры или списки самих себя (шаблон синглтона). Ака:

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

Или что-то в этом роде (синтаксис кода неправильный, но должен дать вам общее представление). Если ваши классы сущностей собираются реализовать подобные методы, абстрагируйте их в контракт интерфейса и получите ваши классы частичных сущностей для реализации этого интерфейса.

0 голосов
/ 24 февраля 2012

Чтобы обеспечить безопасность вашего 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();
  }
}
...