Оптимизировать код Linq - PullRequest
       7

Оптимизировать код Linq

0 голосов
/ 27 сентября 2010

Таблица:

Элемент
Id

Ключевое слово
Идентификатор
Ключевое слово

ItemKeyword
ItemId
KeywordId
SequenceNumber

<ч /> для поиска товаров по ключевому слову:

Keyword keyword = Keyword.FirstOrDefault(a => a.Keyword
    .Equals(input, StringComparison.InvariantCultureIgnoreCase));
IEnumerable<Item> items = keyword.ItemKeyword.OrderBy(a => a.SequenceNumber)
    .SelectMany(a => a.Item);

для получения связанных ключевых слов:

IEnumerable<Keyword> relatedKeywords = items.ItemKeyword
    .SelectMany(a => a.Keyword)
    .Except(keyword);
IEnumerable<Keyword> orderedRelatedKeywords = relatedKeywords
    .OrderByDescending(a => relatedKeywords
        .Where(b => b
            .Keyword.Equals(a.Keyword, StringComparison.InvariantCultureIgnoreCase))
            .Count())
    .Distinct();

У меня сейчас нет компьютера для разработки, но я надеюсь, что вы поняли мою идею. Моя настоящая проблема здесь в том, чтобы упорядочить связанные ключи по времени их использования. Есть ли способы, которыми мы могли бы сделать это? Спасибо.

1 Ответ

1 голос
/ 27 сентября 2010

Хм, вы говорите, что LinqToEntities подразумевает, что эти запросы будут выполняться в базе данных ... Если запросы выполняются в базе данных, не являются ли сравнения строк без учета регистра?который будет группировать, а затем упорядочить по количеству групп.

IQueryable<string> orderedKeywords =
  from k in Keywords
  group k.Keyword by k.Keyword into g
  order by g.Count() descending
  select g.Key;

  // lambda syntax of above
IQueryable<string> orderedKeywords = Keywords
  .GroupBy(k => k.Keyword)
  .OrderByDescending(g => g.Count())
  .Select(g => g.Key)
...