Разработка шаблонов с использованием IQueryable <T> - PullRequest
14 голосов
/ 22 сентября 2008

С появлением .NET 3.5 и интерфейса IQueryable<T> появятся новые шаблоны. Хотя я видел несколько реализаций шаблона спецификации, я не видел много других шаблонов, использующих эту технологию. Приложение Роберта Конери Storefront - это еще один конкретный пример использования IQueryable<T>, который может привести к появлению новых шаблонов.

Какие шаблоны появились из полезного интерфейса IQueryable<T>?

Ответы [ 2 ]

8 голосов
/ 22 сентября 2008

Это также значительно упростило реализацию шаблона хранилища. Вы можете создать общий репозиторий:

public class LinqToSqlRepository : IRepository
{
   private readonly DataContext _context;

   public LinqToSqlRepository(DataContext context)
   {
       _context = context;
   }

   public IQueryable<T> Find<T>()
   {
       return _dataContext.GetTable<T>(); // linq 2 sql
   }

   /** snip: Insert, Update etc.. **/
}

, а затем используйте его с linq:

var query = from customers in _repository.Find<Customer>() 
            select customers;
7 голосов
/ 14 марта 2009

Мне нравится шаблон фильтра репозитория. Это позволяет отделить задачи от среднего и конечного уровня данных без ущерба для производительности.

Ваш уровень данных может концентрироваться на простых операциях стиля list-get-save, в то время как ваш средний уровень может использовать расширения IQueryable для обеспечения более надежной функциональности:

Репозиторий (слой данных):

public class ThingRepository : IThingRepository
{
    public IQueryable<Thing> GetThings()
    {
        return from m in context.Things
               select m; // Really simple!
    }
}

Фильтр (Сервисный слой):

public static class ServiceExtensions
{
    public static IQueryable<Thing> ForUserID(this IQueryable<Thing> qry, int userID)
    {
        return from a in qry
               where a.UserID == userID
               select a;
    }
}

Услуги:

public GetThingsForUserID(int userID)
{
    return repository.GetThings().ForUserID(userID);
}

Это простой пример, но фильтры можно безопасно комбинировать для создания более сложных запросов. Производительность сохраняется, поскольку список не материализуется, пока все фильтры не будут встроены в запрос.

Мне это нравится, потому что мне не нравятся репозитории для конкретных приложений!

...