实体框架中的大表

时间:2013-08-05 22:32:02

标签: c# sql-server azure

我在Windows Azure Server中有一个WEB SQL,我需要在一个包含40.000行的表中搜索一个项目。对于Web应用程序(或任何类型的应用程序来说),查询的执行时间是一分钟,太长。 ai做了什么来减少这个时间?

我的问题类似于:Entity Framework Very Large Table to List,但答案是不可接受的,因为分页方法也很大。

搜索代码:

    public ActionResult SearchNcm(string typeSearch, string searchString)
    {
        var ncms = repository.VIEWNCM.ToList();

        if (Request.IsAjaxRequest())
        {
            if (!String.IsNullOrEmpty(searchString))
            {
                switch (typeSearch)
                {
                    case "cod":
                        ncms = ncms.Where(e => e.CODIGO_LEITURA.ToLower().Contains(searchString.ToLower()) || e.CODIGO.ToLower().Contains(searchString.ToLower())).ToList();
                        break;
                    default:
                        ncms = ncms.Where(e => e.DESCRICAO.ToLower().Contains(searchString.ToLower())).ToList();
                        break;
                }
            }
        }



        return PartialView("BuscarNcm", ncms);
    }

1 个答案:

答案 0 :(得分:1)

不是答案,但我需要在上面的评论中扩展空间:

请记住,在迭代或调用ToList()之前,IQueryable和IEnumerable将不会执行任何操作。这意味着您可以执行以下操作:

var ncms = repository.VIEWNCM; // this should be IQueryable or IEnumerable - no query yet

if(Request.IsAjaxRequest())
{
    if(!string.IsNullOrEmpty(searchString))
    {
        switch(typeSearch)
        {
                case "cod":
                    // No query here either!
                    ncms = ncms.Where(e => e.CODIGO_LEITURA.ToLower().Contains(searchString.ToLower()) || e.CODIGO.ToLower().Contains(searchString.ToLower()));
                    break;
                default:
                    // Nor here!
                    ncms = ncms.Where(e => e.DESCRICAO.ToLower().Contains(searchString.ToLower()));
                    break;
            }
        }
    }
}
// This is the important bit - what happens if the request is not an AJAX request?
else
{
    ncms = ncms.Take(1000); // eg, limit to first 1000 rows
}

return PartialView("BuscarNcm", ncms.ToList()); // finally here we execute the query before going to the View

如果searchString为空,您可能还需要一个默认过滤器