1

SQL プロファイラーは、EF が次の LINQ クエリから同じクエリを最大 8 回発行していることを示しています。

var query = (from wtv in _context.WorkTypeVersions
               join rc in _context.RateCategories on wtv.WTVID equals rc.WTVID
               join rsc in _context.RateSubCategories on rc.RCID equals rsc.RCID
               where (wtv.Composite == (ckCompositePreambles.Checked ? "Y" : "N")
                      && rc.CatCode == catCode)

               select new pRateSubCategory()
                {
                  WTVID = wtv.WTVID,
                  RSCID = rsc.RSCID,
                  WTVersionName = wtv.WTVersionName,
                  SubCatCode = rsc.SubCatCode,
                  PCode = rsc.Preamble.SectionCode,
                  RateCategoryName = rc.RateCategoryName,
                  RateSubCategoryName = rsc.RateSubCategoryName,
                  FullSubCatName = rsc.FullSubCatName,
                  PMBID = rsc.PMBID,
                  Preamble = rsc.Preamble
                });

  dgvRateSubCategories.AutoGenerateColumns = false;
  lblSubSectionCount.Text = "SubSections: " + bsRateSubCategories.Count;
  dgvRateSubCategories.DataSource = bsRateSubCategories;

  bsRateSubCategories.DataSource = query;

TSQL クエリ (他は散在していますが、最大 8 回生成されます) は次のとおりです。

    exec sp_executesql N'SELECT 
    [Project1].[WTVID] AS [WTVID], 
    [Project1].[RSCID] AS [RSCID], 
    [Project1].[WTVersionName] AS [WTVersionName], 
    [Project1].[SubCatCode] AS [SubCatCode], 
    [Project1].[SectionCode] AS [SectionCode], 
    [Project1].[RateCategoryName] AS [RateCategoryName], 
    [Project1].[RateSubCategoryName] AS [RateSubCategoryName], 
    [Project1].[FullSubCatName] AS [FullSubCatName], 
    [Project1].[PMBID] AS [PMBID], 
    [Project1].[PMBID1] AS [PMBID1], 
    [Project1].[PMB_Level] AS [PMB_Level], 
    [Project1].[PMB_Text] AS [PMB_Text], 
    [Project1].[Composite] AS [Composite], 
    [Project1].[PMB_XPS] AS [PMB_XPS]
    FROM ( SELECT 
        [Extent1].[WTVID] AS [WTVID], 
        [Extent1].[WTVersionName] AS [WTVersionName], 
        [Extent2].[RateCategoryName] AS [RateCategoryName], 
        [Extent3].[RSCID] AS [RSCID], 
        [Extent3].[PMBID] AS [PMBID], 
        [Extent3].[RateSubCategoryName] AS [RateSubCategoryName], 
        [Extent3].[SubCatCode] AS [SubCatCode], 
        [Extent3].[FullSubCatName] AS [FullSubCatName], 
        [Extent4].[PMBID] AS [PMBID1], 
        [Extent4].[PMB_Level] AS [PMB_Level], 
        [Extent4].[SectionCode] AS [SectionCode], 
        [Extent4].[Composite] AS [Composite], 
        [Extent4].[PMB_Text] AS [PMB_Text], 
        [Extent4].[PMB_XPS] AS [PMB_XPS]
        FROM    [dbo].[WorkTypeVersions] AS [Extent1]
        INNER JOIN [dbo].[RateCategories] AS [Extent2] ON [Extent1].[WTVID] = [Extent2].[WTVID]
        INNER JOIN [dbo].[RateSubCategories] AS [Extent3] ON [Extent2].[RCID] = [Extent3].[RCID]
        LEFT OUTER JOIN [dbo].[Preambles] AS [Extent4] ON [Extent3].[PMBID] = [Extent4].[PMBID]
        WHERE ([Extent1].[Composite] = (CASE WHEN (@p__linq__0 = 1) THEN N''Y'' ELSE N''N'' END)) AND ([Extent2].[CatCode] = @p__linq__1)
    )  AS [Project1]
    ORDER BY [Project1].[SubCatCode] ASC, [Project1].[WTVersionName] ASC',N'@p__linq__0 bit,@p__linq__1 varchar(8000)',@p__linq__0=0,@p__linq__1='A'    

EF の現在のバージョン: System.Data.Entity: 4.0.0.0、EntityFramework: 4.3.1

ここで何が欠けていますか?

4

1 に答える 1

3

問題は、データ ソースを設定する場所です。

bsRateSubCategories.DataSource = query;

query変数は、インターフェイスを拡張するインターフェイスを実装しますIQueryable<T>(これIEnumerable<T>必要DataSourceです)。これをグリッドにバインドすると、グリッドはそれ自体をレンダリングするために結果を複数回列挙します。

ただし、グリッドに を実装するデータ ソースを提供したためIQuerable<T>、クエリが列挙されるたびに、サーバーに対してクエリが実行されます。これがおそらく、何度も表示される理由です。

これを軽減するには、リストを に割り当てる前に、次のようDataSourceToList拡張メソッドを使用してリストを具体化する必要があります (読み取り専用のToArray場合は問題ありませんが、新しい項目を追加する必要がある場合は を使用しますToList)。

bsRateSubCategories.DataSource = query.ToList();

もちろん、DataSourceデータのソースがサーバーから完全に切断されているため、いつリセットするのが適切かを判断する必要があります。

于 2012-08-27T17:14:37.523 に答える