Выполнение запроса LINQ - PullRequest
1 голос
/ 07 августа 2011

Я использую Entity Framework 4 в проекте, и у меня есть один конкретный запрос, который повторяется снова и снова, и мне нужно быть уверенным, что он оптимизирован настолько хорошо, насколько это возможно.

У меня есть одна таблица базы данных с именем Items, в которой есть следующие важные столбцы:

id (primary key)
name

Другая таблица с именем FavoriteItems имеет два важных столбца

itemId (foreign key to the items table)
accountId( foreign key to the account table)

В методе в моем коде у меня есть accountId и searchTerm в качестве входных параметров.

Метод должен возвращать все элементы из таблицы элементов, у которой searchTerm является частью его имени, кроме того, он должен быть отсортирован по алфавиту, но все элементы, у которых есть его Id, найдены в таблице FavoriteItems, где accountId совпадает с accountId данный параметр должен быть помещен сверху (и отсортирован по алфавиту). Кроме того, результат поиска должен содержать логическое значение, указывающее, является ли это любимым элементом или нет.

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

1 Ответ

3 голосов
/ 07 августа 2011

Я думаю, что вы имеете в виду что-то вроде этого:

public void TheMethod(int accountId, string searchTerm)
{
    var result = from item in ctx.Items
                 where item.Name.Contains(searchTerm)
                 let temp = new
                     {
                         Name = item.Name,
                         IsFavorite = item.FavoriteItems
                             .Any(f => f.AccountId == accountId)
                     }
                 orderby temp.IsFavorite descending, temp.Name
                 select temp;
}

Создайте промежуточный объект с нужными вам значениями, закажите его и выберите его.

Я не думаю, что этоможно оптимизировать дальше, потому что вам нужны все элементы, которые имеют searchTerm в названии.Это, пожалуй, самые дорогие детали, так как он конвертируется в WHERE Name LIKE %@name%.

Вызов .Any, который приводит к появлению поля IsFavorite, приводит к типу запроса EXISTS SELECT TOP(1)... и должен быть довольно дешевым.

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