Я делаю поиск в таблице базы данных с помощью шаблона (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, что приведет к ускорению получения идентификаторов?
благодаря
Я не тестировал его, но вы могли бы сделать что-то в этом направлении:
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
для вас.
С точки зрения производительности вы можете увидеть тесты, которые показывают, если вы будете искать 1 строку в 1 000 000 записей около 100 мс.
Вот ссылка с тестами и реализацией.
for (int y = 0; y < sf.Length; y++)
{
c[y] += ss.Where(o => o.Contains(sf[y])).Count();
}
context2
есть ссылка наName
, класс элементаcontext1
? Другими словами, возможно лиx.Name.name
в предикате?Context2
имеет FKS PKContext1
, будет ли быстрее использовать виртуальный тип в COntext2? такContext.name.where..