我正在使用通配符搜索数据库表(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中我可以更改哪些内容会导致ID更快?
由于
答案 0 :(得分: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
匹配的对(请参阅this tutorial on the join
clause)。 where
行执行实际过滤。
它应该更快,因为整个匹配是在数据库中完成的,只返回正确的ID。
如果Name
项目类中有context2
属性,其中包含对context1
项的引用,则可以将其写为更具可读性:
var total = context2
.Where(x => x.Name.name.ToLower().Contains(searchTerm.toLower()))
.Select(x => x.ID);
在这种情况下,Linq to SQL会自动为您执行join
。
答案 1 :(得分:0)
在性能方面,您可以看到测试,显示您是否在1 000 000个条目中搜索1个字符串,大约100毫秒。
以下是带有测试和实现的link。
for (int y = 0; y < sf.Length; y++)
{
c[y] += ss.Where(o => o.Contains(sf[y])).Count();
}