2

データベースに約1 millionデータがあります( MySQL)

very slow生成された SQL EntityFramework があまり良くないため (30 秒以上)、高度な検索機能があります。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 形式の場合、次のようになりますvery fast

 SELECT
*
FROM `tnews` AS `Extent1`
 WHERE `Extent1`.`Region` = 'Americas(2)'
 ORDER BY 
 `PnetDT` DESC LIMIT 0,20
4

2 に答える 2

1

独自の SQL を DbSet から直接実行して、EF のすべての利点を得ることができます。

http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.sqlquery(v=vs.103).aspx

また、他の方法については、これらの回答を参照してください。

エンティティ フレームワークでネイティブ SQL を実行することは可能ですか?

于 2012-11-01T07:04:35.460 に答える
0

クエリを生成した LINQ は次のようになります。

IQueryable<CNNews> result = _dbRawDataContext.CNNews
    .OrderByDescending(n => n.PnetDT)
    .Where(x => x.Region == advArgs.RegionName)
    .Skip(pagenum * pagesize)
    .Take(pagesize);

すべての項目を選択して注文するように LINQ に指示します。次に、そのサブセットを取るように指示します。SQL は、指定したものとまったく同じように見えます。

Where()呼び出しが呼び出しの前になるようにコードを多少再配置すると、OrderByDescending()より良い SQL が得られると思います。

IQueryable<CNNews> result = _dbRawDataContext.CNNews
    .Where(x => x.Region == advArgs.RegionName)
    .OrderByDescending(n => n.PnetDT)
    .Skip(pagenum * pagesize)
    .Take(pagesize);

OrderByDescending()また、 and Skip()/の順序を変更するとTake()異なる結果が得られるかどうかもわかりません。

(免責事項:私はそれをテストしていません)

于 2012-11-01T07:16:58.683 に答える