LINQ to SQL с большой таблицей базы данных повышает производительность

1

Я делаю поиск в таблице базы данных с помощью шаблона (contains расширение) Вот код

// This gets a list of the primary key IDs in a table that has 5000+ plus records in it
List<int> ids = context.Where(m => m.name.ToLower().Contains(searchTerm.ToLower())).Select(m => m.Id).ToList();


// Loop through all the ids and get the ones that match in a different table (So basically the FKs..)
foreach (int idin nameId)
{
    total.AddRange(context2.Where(x => x.NameID == id).Select(m => m.Id).ToList());
}

В чем я могу изменить в LINQ, что приведет к ускорению получения идентификаторов?

благодаря

  • 0
    В классе элемента context2 есть ссылка на Name , класс элемента context1 ? Другими словами, возможно ли x.Name.name в предикате?
  • 0
    Нет, Context2 имеет FKS PK Context1 , будет ли быстрее использовать виртуальный тип в COntext2? так Context.name.where..
Показать ещё 1 комментарий
Теги:
linq

2 ответа

1
Лучший ответ

Я не тестировал его, но вы могли бы сделать что-то в этом направлении:

var total =
    from obj2 in context2
    join obj1 in context1 on obj2.NameID equals obj1.Id
    where obj1.name.ToLower().Contains(searchTerm.ToLower())
    select obj2.Id

Он объединяет две таблицы, сначала производя декартовую продукцию, а затем ограничивая ее парами, в которых соответствует NameId (см. Это руководство по предложению join). Линия, where выполняется фактическая фильтрация.

Это должно быть быстрее, потому что все сопоставление выполняется в базе данных, и возвращаются только правильные идентификаторы.

Если у вас есть свойство Name в классе context2, содержащем ссылку на элемент context1, вы можете записать его более читаемым:

var total = context2
    .Where(x => x.Name.name.ToLower().Contains(searchTerm.toLower()))
    .Select(x => x.ID);

В этом случае Linq to SQL автоматически выполнит join для вас.

  • 0
    Конечно, я делал 2 запроса, где я мог использовать соединение, как вы правильно указали. Нужно привыкнуть к стилю LINQ, который вы разместили. Я думаю, это больше похоже на SQL. Спасибо!
  • 0
    Фактически, вы делали один запрос для каждого имени, соответствующего строке поиска, поэтому для коротких поисковых терминов это много запросов.
0

С точки зрения производительности вы можете увидеть тесты, которые показывают, если вы будете искать 1 строку в 1 000 000 записей около 100 мс.

Вот ссылка с тестами и реализацией.

for (int y = 0; y < sf.Length; y++)
    {
        c[y] += ss.Where(o => o.Contains(sf[y])).Count();
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню