LINQ to SQL用大型数据库表提高了性能

时间:2014-11-02 16:59:11

标签: c# linq

我正在使用通配符搜索数据库表(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更快?

由于

2 个答案:

答案 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();
    }