Разница в производительности запросов linq-to-sql с помощью GenericRespositry - PullRequest
0 голосов
/ 01 июня 2010

Учитывая, что у меня есть такой класс в моем Слой данных

public class GenericRepository<TEntity> where TEntity : class 
{

   public MyDataContext DataContext {get;set;}

   [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
   public IQueryable<TEntity> SelectAll()
   {
      return DataContext.GetTable<TEntity>();
   }
}

Я мог бы запросить таблицу в моей базе данных, например, из более высокого уровня

using (GenericRepositry<MyTable> mytable = new GenericRepositry<MyTable>())
{
   var myresult = from m in mytable.SelectAll()
                  where m.IsActive
                  select m;
}

это значительно медленнее, чем использование обычного кода в моем уровне данных

using (MyDataContext ctx = new MyDataContext())
{
   var myresult = from m in ctx.MyTable
                  where m.IsActive
                  select m;
}

Устранение необходимости писать простые выборки таблиц в слое данных экономит много времени, но буду ли я сожалеть об этом?

Редактировать: @ Скит Я на самом деле реализовал этот подход в довольно большом LOB-проекте WCF / Silverlight, и кажется, что процессоры наших серверов пытаются не отставать. Дополнительная работа по созданию / уничтожению дополнительных объектов не может быть объяснена ростом использования ЦП над проектами обычным способом?

1 Ответ

1 голос
/ 01 июня 2010

Вы не показали, откуда ваш "общий репозиторий" получает свой контекст - я предполагаю, что он создает новый и передает вызов dispose?

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

Важным моментом является то, что вы все еще используете IQueryable<T> в обоих случаях, поэтому запрос все равно будет переведен в SQL - если ваш SelectAll метод вернул IEnumerable<T>, это было бы катастрофически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...