如何查询大表和列表对象

时间:2012-10-07 18:19:24

标签: c# asp.net sql linq

我有一个大表,我需要查询120万行。包含在同一个字段中。有一个字段combined_name需要使用列表进行查询。我现在只想用一个字段来检查性能,这反映在代码中。我写它的方式花了太长时间。有没有办法让我不必将表加载到内存中?

JDataClassDataContext db = new JDataClassDataContext();
var fullName = txtSearchBox0.Text.Trim();
List<string> firstName = new List<string>(txtSearchBox1.Text.Split(',').Select(x => Convert.ToString(x)).ToList());

var rows = (from c in db.defendants_ALLs.AsEnumerable()
      where c.combined_name.Contains(fullName)
          && firstName.Any(n => c.combined_name.Contains(n))
      select c).ToList();     

dlSearch.DataSource = rows;
dlSearch.DataBind();

2 个答案:

答案 0 :(得分:1)

查看Skip()Take()方法。

你可以像这样使用它:

var rows = (from c in db.defendants_ALLs.AsEnumerable()
           where c.combined_name.Contains(fullName)
           && firstName.Any(n => c.combined_name.Contains(n))
           select c).OrderBy(o => o.id).Skip(amount).Take(otherAmount).ToList();

其中amountotherAmount表示您希望从数据库中实际获取的记录数量。这意味着你可以在instace中只询问30条记录,而不是完整的120万条(==如果你只是做.ToList()会发生什么)

答案 1 :(得分:1)

最好的方法是生成一个好的老式SQL查询 “SELECT字段FROM表WHERE combined_name LIKE'%fullname%'AND firstName IN('first','next',...)” 您应该看看SqlConnection和SqlCommand以及SqlDataReader。它与linq有点不同,但它更快(如果你有正确的索引)