0

MVCMiniProfiler を使用して、いくつかのデータベース クエリをプロファイリングしています。あるクエリでは、コードで定義したクエリの Where 部分を表示できません。

コードは次のとおりです。

MyAppDataContext.cs:

public partial class MyAppDataContext : System.Data.Linq.DataContext {
    public static MyAppDataContext CreateNewContext() {

        var sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyAppConnectionString"].ToString());
        var profiledConnection = new ProfiledDbConnection(sqlConnection, MiniProfiler.Current);
        return new MyAppDataContext(profiledConnection);

    }
}

プログラムコード:

MyAppDataContext DataContext = MyAppDataContext.CreateNewContext();
IEnumerable<Requests> Entities = DataContext.Requests;

using (profiler.Step("get data")) {
    var dataset = Entities.Where(x => x.ControleStatus == 4).OrderBy(x => x.ID)
}

私も試しました:

using (profiler.Step("get data")) {
    var dataset = from x in Entities 
                  where x.ControleStatus == 4
                  orderby x.ID
                  select x;
}

これは、MVC Mini Profiler が表示するものです。

SELECT [t0].[ID], [t0].[DatumOntvangst], [t0].[DatumRapport], [t0].[FK_SID], 
    [t0].[ControleStatus], [t0].[SStatus] FROM [dbo].[Request] AS [t0] 

ご覧のとおり、Where ステートメントはありません。ところで: 出力には正しい結果が含まれていますが、このクエリが完了するまでに 30 秒かかるため、すべてのデータが最初にデータベースから取得され、次に (データベースではなく) コードで where 条件が適用されるのではないかと考えています。

4

1 に答える 1

3

IQueryable を返すようにする必要があります。IEnumerable を返すことにより、残りの式ツリーが IQueryable プロバイダーによって変換されることを許可しません。クエリ演算子の LINQ to Objects バージョンは、IEnumerable で動作します。LINQ to SQL には IQueryable バージョンが必要です。

于 2012-06-14T18:40:07.023 に答える