Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何优化我的搜索?_.net_Sql Server_Linq - Fatal编程技术网

.net 如何优化我的搜索?

.net 如何优化我的搜索?,.net,sql-server,linq,.net,Sql Server,Linq,我正在编写一个测试应用程序,以了解如何优化对大量记录的搜索,并将其显示在gridview中 目前,我有一个测试表,其中包含20000条记录(目前没有索引),我希望在gridview中以20条为一批显示这些记录。但我不确定如何做到这一点,我正试图理解背后的理论 namespace TestingIndexes { public partial class Default : System.Web.UI.Page { protected void Page_Load(object s

我正在编写一个测试应用程序,以了解如何优化对大量记录的搜索,并将其显示在gridview中

目前,我有一个测试表,其中包含20000条记录(目前没有索引),我希望在gridview中以20条为一批显示这些记录。但我不确定如何做到这一点,我正试图理解背后的理论

namespace TestingIndexes
{
  public partial class Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnStart_Click(object sender, EventArgs e)
    {
      gvResults.DataSource = GetContacts();
      gvResults.DataBind();
    }

    private List<Contact> GetContacts()
    {
      List<Contact> contacts = new List<Contact>();

      DataClasses1DataContext dc = new DataClasses1DataContext();

      // Track time elapsed
      Stopwatch sw = new Stopwatch();
      sw.Start();

      var result = from c in dc.GetTable<Contact>()
      select c;

      sw.Stop();
      ltMessage.Text = "<p>Time elapsed: " + sw.ElapsedMilliseconds + "</p>";

      if (result.Count() > 0)
        contacts = result.ToList<Contact>();

      return contacts;
    }
  }
}
命名空间测试索引
{
公共部分类默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的无效btnStart\u单击(对象发送者,事件参数e)
{
gvResults.DataSource=GetContacts();
gvResults.DataBind();
}
私有列表GetContacts()
{
列表联系人=新列表();
DataClasses1DataContext dc=新DataClasses1DataContext();
//经过的跟踪时间
秒表sw=新秒表();
sw.Start();
var result=来自dc.GetTable()中的c
选择c;
sw.Stop();
ltMessage.Text=“经过的时间:“+sw.elapsedmillyses+”

”; 如果(result.Count()>0) contacts=result.ToList(); 返回联系人; } } }
如您所见,这是一个使用LINQ的非常简单的查询,我非常确定,我不希望每次都将20000条记录带入内存,以便将其绑定到gridview。但是,还有什么选择呢?我想我要做的是最终查询数据库,找出有许多记录,但在gridview中一次只显示20条记录。这是由SQL Server处理的吗?我确信一定有关于我试图做什么的文章,但我不完全确定我应该搜索什么。任何指向教程的指针或链接都将非常有用


有人能帮我指出正确的方向吗?

您应该使用
Skip
Take
从数据库表中获取部分数据

var result = dc.GetTable<Contact>().Skip(40).Take(20).ToList();
var result=dc.GetTable().Skip(40).Take(20).ToList();

您应该使用
Skip
Take
从数据库表中获取部分数据

var result = dc.GetTable<Contact>().Skip(40).Take(20).ToList();
var result=dc.GetTable().Skip(40).Take(20).ToList();

首先、最后和所有方式在表上构建一个(聚集)索引,理想情况下,该索引也包括要返回的行。如果不这样做,SQL将逐步遍历所有记录。如果覆盖索引已就位,SQL将仅访问该索引。如果您想了解SQL,那么可能没有比Kalen Delaney更好的来源了。“覆盖索引”和更多内容都有清晰的解释,即使是对她书中内容的肤浅理解也会让你成为一名更好的开发人员哦,而且有一种方法是首先、最后和所有方式在表上构建一个(聚集的)索引,理想的是一个覆盖你想要返回的行的索引。如果不这样做,SQL将逐步遍历所有记录。如果覆盖索引已就位,SQL将仅访问该索引。如果您想了解SQL,那么可能没有比Kalen Delaney更好的来源了。“覆盖索引”和更多内容都解释得很清楚,即使是对她书中内容的肤浅理解也会让你成为一名更好的开发人员哦,还有

谢谢-这就清楚了如何检索所需的记录。然而,我对存储“大量”数据的位置感到困惑。例如,我是否要查询数据库并将所有记录提取到内存中,然后对此使用skip/take?还是有更有效的方法?请原谅我的措辞不好,但是否可以提取所有记录并将其存储在sql server中的临时结果表中,然后在此结果集上使用跳过/接受?否,在我的答案中进行查询将被转换为sql,该sql将只检索指定的行,但这没有意义。当然,这些记录需要存储在一个临时表中,以便您翻阅?否则,在分页时可能会将记录添加到数据库中,这会扭曲结果…当然,在分页时可以将行添加到表中,但我不认为这是一个问题。啊,好的,谢谢-这至少给了我一些进一步的调查:-)谢谢-这就清除了如何检索所需记录。然而,我对存储“大量”数据的位置感到困惑。例如,我是否要查询数据库并将所有记录提取到内存中,然后对此使用skip/take?还是有更有效的方法?请原谅我的措辞不好,但是否可以提取所有记录并将其存储在sql server中的临时结果表中,然后在此结果集上使用跳过/接受?否,在我的答案中进行查询将被转换为sql,该sql将只检索指定的行,但这没有意义。当然,这些记录需要存储在一个临时表中,以便您翻阅?否则,在分页时可能会将记录添加到数据库中,这会扭曲结果…确保在分页时可以将行添加到表中,但是我不认为这是一个问题。啊,好吧,谢谢-这至少给了我一些进一步调查的机会:-)作为旁注,使用你问题中的代码实际上会两次查询数据库中的所有数据,一次用于
Count()
操作,一次用于
ToList()
操作。我的规则永远不会(如果可以避免的话)使用扩展方法
Count()
,那么您如何检查是否有未使用.Count()而返回的记录呢?只需执行ToList()(计算查询),然后在列表中计数,作为旁注,使用您所问的代码实际上会在数据库中查询两次所有数据,一次用于
Count()
操作,一次用于
ToList()
操作。我的规则永远不会(如果可以避免的话)使用扩展方法
Count()
,那么您如何检查是否有未使用.Count()返回的记录?只需执行ToList()(计算查询),然后在列表上计数即可