Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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 加快LINQ查询的技巧?_.net_Linq - Fatal编程技术网

.net 加快LINQ查询的技巧?

.net 加快LINQ查询的技巧?,.net,linq,.net,Linq,我有一个LINQ查询,它搜索一个大约250000条记录的SQL表,只搜索2个字段。这两个字段都已编制索引,但我发现其运行速度仍然相当慢 下面是代码,有人能提出一些建议来加速它吗 谢谢 var qryN = ( from bn in dbs.Uploads orderby bn.ID descending select new { ID = bn.ID, Serial = bn.serial_no, Manufact

我有一个LINQ查询,它搜索一个大约250000条记录的SQL表,只搜索2个字段。这两个字段都已编制索引,但我发现其运行速度仍然相当慢

下面是代码,有人能提出一些建议来加速它吗

谢谢

var qryN = (
    from bn in dbs.Uploads
    orderby bn.ID descending
    select new
    {

        ID = bn.ID,
        Serial = bn.serial_no,
        Manufacturer = bn.Mfgr,
        Model = bn.model,
        Code = bn.code,
        Qty = bn.qty,
        Description = bn.description,
        Comments = bn.comments,
        Location = bn.location,
        Price = bn.price,
        Email = "Register / Login for full details"
    });

if (dlType.Text != " " && dlType.Text != "")
{
    qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue);
}

if (txtWord.Text != "")
{
    qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text));
    }

gvLoggedOff.DataSource =
    from p in qryN
    select new
    {
        p.ID, 
        p.Serial, 
        p.Manufacturer, 
        p.Model, p.Code, 
        p.Qty, 
        p.Description, 
        p.Comments, 
        p.Location, 
        p.Price, 
        p.Email
    };

gvLoggedOff.DataBind();    var qryN = (
    from bn in dbs.Uploads
    orderby bn.ID descending
    select new
    {

        ID = bn.ID,
        Serial = bn.serial_no,
        Manufacturer = bn.Mfgr,
        Model = bn.model,
        Code = bn.code,
        Qty = bn.qty,
        Description = bn.description,
        Comments = bn.comments,
        Location = bn.location,
        Price = bn.price,
        Email = "Register / Login for full details"
    });

if (dlType.Text != " " && dlType.Text != "")
{
    qryN = qryN.Where(bn => bn.Manufacturer == dlType.SelectedValue);
}

if (txtWord.Text != "")
{
    qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text));
    }

gvLoggedOff.DataSource =
    from p in qryN
    select new
    {
        p.ID, 
        p.Serial, 
        p.Manufacturer, 
        p.Model, p.Code, 
        p.Qty, 
        p.Description, 
        p.Comments, 
        p.Location, 
        p.Price, 
        p.Email
    };

gvLoggedOff.DataBind();
两件事:

  • 由于要添加过滤器,请将投影(选择新的匿名类型)移动到最后一行,而不是第一行,即
    DataSource
  • 你订得很早。除非queryable或查询分析器足够聪明来分析和优化它,否则数据库必须在开始过滤之前订购250000行。尽可能晚地移动排序,可能就在投影发生之前
下面是修改示例的简短尝试:

var qryN = dbs.Uploads.AsQueryable();

if (dlType.Text != " " && dlType.Text != "")
    qryN = qryN.Where(bn => bn.Mfgr == dlType.SelectedValue);

if (txtWord.Text != "")
    qryN = qryN.Where(bn => bn.description.Contains(txtWord.Text));

gvLoggedOff.DataSource = qryN.OrderByDescending(bn => bn.ID)
    .Select(bn => new { 
        bn.ID, Serial = bn.serial_no, Manufacturer = bn.Mfgr,
        Model = bn.model, Code = bn.code, Qty = bn.qty,
        Description = bn.description, Comments = bn.comments,
        Location = bn.location, Price = bn.price,
        Email = "Register / Login for full details" });

gvLoggedOff.DataBind();

因为这被接受为一个答案:关于文本搜索可能也适用于某些情况。全文搜索可能会耗尽性能,这是您无法相信的。

说明中的筛选器可能会出现问题:

qryN = qryN.Where(bn => bn.Description.Contains(txtWord.Text));
包含的
调用被转换为类似“%”++@p0++“%”的SQL
描述
。这意味着,即使在
description
列上有索引,SQL server也必须循环遍历完整的索引(甚至可能是完整的表)。如果可能,将该行更改为以下内容:

qryN = qryN.Where(bn => bn.Description.StartsWith(txtWord.Text));

这将转换为
描述,如@p0+'%'
,这允许您的数据库服务器有效地使用索引。

描述。包含
听起来很重,您可以尝试使用全文搜索


是一篇描述如何使用LINQ的FTS的帖子。

你看过生成的SQL并对其进行分析了吗?制造商是否有FK?Jon完全正确。你的问题目前很模糊。我们不知道您的数据模型看起来如何,生成了什么,是否使用LINQ to SQL、实体框架、NHibernate等等。是的,我确实意识到了这一点,但这正是客户想要的。我采用了你的解决方案,然后将史蒂文斯放在一个领域,结果非常好——谢谢again@Pedro:哦,当然,我不是说“不要这样做”,我只是说“注意它”。一个小的补充:
if(dlType.Text!=”“&&dlType.Text!=”)
可以是
if(!string.IsNullOrWhiteSpace(dlType.Text))
以及其他改进。我选择不让它们更容易关联。