2010-04-16 1 views
0

У меня есть класс, который обеспечивает общий доступ к LINQ к SQL сущностей, например:Как повысить эффективность запросов, выполняемых этим общим классом доступа к данным Linq-to-SQL?

class LinqProvider<T> //where T is a L2S entity class 
{ 
    DataContext context; 

    public virtual IEnumerable<T> GetAll() 
    { 
     return context.GetTable<T>(); 
    } 

    public virtual T Single(Func<T, bool> condition) 
    { 
     return context.GetTable<T>().SingleOrDefault(condition); 
    } 
} 

От переднего конца, оба этих метода появляются работать как и следовало ожидать. Однако, когда я запускаю трассировку в профилировщике SQL, метод Single выполняет то, что составляет SELECT * FROM [Table], а затем возвращает единую сущность, которая соответствует заданному условию. Очевидно, что это неэффективно и вызвано GetTable(), возвращающим все строки.

Мой вопрос: как получить запрос, выполненный методом Single(), принять форму SELECT * FROM [Table] WHERE [condition], а не выбирать все строки, а затем отфильтровывать все, кроме одного? Возможно ли в этом контексте?

Любая помощь приветствуется.

ответ

3

Заменить Func<...> на Expression<Func<...>>.

+0

Отлично, просто испытал это, и он работает очарованием. Очень просто, и мне не нужно менять какой-либо код. Большое спасибо! –

Смежные вопросы