Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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
C# 如何提高查询性能_C#_Mysql_Entity Framework - Fatal编程技术网

C# 如何提高查询性能

C# 如何提高查询性能,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我的数据库中大约有100万数据(MySQL) 还有一个高级搜索功能,速度非常慢(超过30秒),因为生成的SQL EntityFramework不是很好,SQL: SELECT `Project1`.* FROM ( SELECT `Extent1`.* FROM `tnews` AS `Extent1` WHERE `Extent1`.`Region` = 'Americas(2)' ) AS `Project1` ORDER BY `Project1`.`PnetDT` DESC L

我的数据库中大约有
100万
数据(
MySQL

还有一个高级搜索功能,速度非常慢(超过30秒),因为生成的SQL EntityFramework不是很好,SQL:

SELECT
`Project1`.*
FROM 
(
SELECT
`Extent1`.*
FROM `tnews` AS `Extent1`
 WHERE `Extent1`.`Region` = 'Americas(2)'
 ) AS `Project1`
 ORDER BY 
`Project1`.`PnetDT` DESC LIMIT 0,20
C#功能:

    private List<CNNews> AdvancedSearchAndPage(int pagenum, int pagesize,
        AdvSearchArgs advArgs)
    {
        IQueryable<CNNews> result = _dbRawDataContext.CNNews.
            OrderByDescending(n => n.PnetDT);

        if (!string.IsNullOrWhiteSpace(advArgs.Feed))
        {
            result = result.Where(news => news.Feed == advArgs.Feed);
        }

        if (!string.IsNullOrWhiteSpace(advArgs.PNET))
        {
            result = result.Where(news=>news.PNET == advArgs.PNET);
        }

        if (!string.IsNullOrWhiteSpace(advArgs.ProdCode))
        {
            result = (from news in result
                      where news.ProdCode == advArgs.ProdCode
                      select news);
        }

        if (!string.IsNullOrWhiteSpace(advArgs.Code))
        {
            result = (from news in result
                      where news.Code == advArgs.Code
                      select news);
        }

        if (!string.IsNullOrWhiteSpace(advArgs.BegineDate))
        {
            var begin = Convertion.ToDate(advArgs.BegineDate);
            var end = Convertion.ToDate(advArgs.EndDate);

            result = (from news in result
                      where news.PnetDT >= begin && news.PnetDT < end
                      select news);
        }

        if (!string.IsNullOrWhiteSpace(advArgs.Region))
        {
            result = result.Where(x => x.Region == advArgs.RegionName);
        }

        var pagedList = result.
            Skip(pagenum * pagesize).
            Take(pagesize);
        return pagedList.ToList();
    }

您可以直接从数据库集执行自己的SQL,并获得EF的所有好处,请参阅

还有其他方法,请参阅这些答案以了解更多详细信息


生成查询的LINQ如下所示:

IQueryable<CNNews> result = _dbRawDataContext.CNNews
    .OrderByDescending(n => n.PnetDT)
    .Where(x => x.Region == advArgs.RegionName)
    .Skip(pagenum * pagesize)
    .Take(pagesize);
另外,我不知道更改
OrderByDescending()
Skip()
/
Take()
的顺序是否会产生不同的结果


(免责声明:我没有测试过)

是。你凭什么认为我没有?嗯。。。你看过问题了吗?听起来你肯定是在问性能问题,而if子句与性能无关。这就是问题所在,你可以试一试。查看楼下的答案尝试以下操作:将
OrderByDescending()
从方法的顶部移动到底部:
IQueryable result=\u dbRawDataContext.CNNews
var pagedList=result.OrderByDescending().Skip(…
。我认为这将提高您的性能(这就是我在回答中试图说的)。
IQueryable<CNNews> result = _dbRawDataContext.CNNews
    .OrderByDescending(n => n.PnetDT)
    .Where(x => x.Region == advArgs.RegionName)
    .Skip(pagenum * pagesize)
    .Take(pagesize);
IQueryable<CNNews> result = _dbRawDataContext.CNNews
    .Where(x => x.Region == advArgs.RegionName)
    .OrderByDescending(n => n.PnetDT)
    .Skip(pagenum * pagesize)
    .Take(pagesize);