Как повысить эффективность запросов, выполняемых этим универсальным классом доступа к данным Linq-SQL? - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть класс, который обеспечивает общий доступ к сущностям 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], а невыбрать все строки, а затем отфильтровать все, кроме одного?Возможно ли в этом контексте?

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

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

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

0 голосов
/ 16 апреля 2010

Это довольно длинная статья, но, вероятно, это будет хорошее начало. Это дает несколько рекомендаций.

http://visualstudiomagazine.com/articles/2007/11/01/optimize-linq-to-sql-performance.aspx

...