MVCMiniProfiler не показывает ГДЕ часть Linq Query

Я использую MVCMiniProfiler для профилирования некоторых запросов к базе данных. Для одного запроса он не показывает часть запроса, которая была определена в моем коде.

код выглядит следующим образом:

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 в коде (в отличие от базы данных).

1 ответ

Решение

Вам нужно, чтобы он возвращал IQueryable. Возвращая IEnumerable, вы не разрешаете преобразованию остальной части дерева выражений провайдером IQueryable. Версии операторов запросов LINQ to Objects работают на IEnumerable. LINQ to SQL требует версии IQueryable.

Другие вопросы по тегам