Шаблоны проектирования с использованием IQueryable <T>

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

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

Ответы

Ответ 1

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

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;

Ответ 2

Мне нравится шаблон репозитория-фильтра. Это позволяет отделять проблемы от среднего и конечного уровней данных, не жертвуя производительностью.

В вашем слое данных можно сосредоточиться на простых операциях стиля 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);
}

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

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