Запрос ничего не возвращает при использовании SqlParamter: Entity Framework

Я написал запрос для отображения заданий, соответствующих определенным критериям на производственной линии. По сути, он показывает незавершенные работы (WIP) для определенного участка производственной линии на моем рабочем месте.

Я использую следующее для выполнения моего запроса:

var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@" ....  ");
return CurrentWIPQuery.Count();

«JobList» — это модель, которая содержит номер задания, имя клиента и некоторую информацию о дате завершения определенных этапов. Таким образом, запрос должен возвращать правильные поля для этих свойств в моей модели.

Итак, это возвращает COUNT строк из запроса; количество работ, которые в настоящее время классифицируются как незавершенные. Из-за конфиденциальности информации я не включил фактический SQL-запрос. НО Я могу сказать вам, что он работает нормально. Проблема возникает, когда я пытаюсь параметризовать этот запрос, так как я хотел бы иметь возможность переключать номер производственной линии в запросе с помощью параметра, а не вводить код для другой строки. При использовании параметров запрос ничего не возвращает.

Я делаю это таким образом, потому что запрос довольно длинный и, похоже, не работает хорошо, когда я использую метод полной структуры сущности.

Вот как я создаю параметры. Я пробовал 2 разных способа сделать это, и оба способа терпят неудачу. Способ 1

var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@"
...query here...",new SqlParameter[] { ("@Cell", CellName),("@line, SCHEDULE_GROUP_NAME)});

Метод 2

SqlParameter WIPParam1 = new SqlParameter("@Cell", CellName);
SqlParameter WIPParam2 = new SqlParameter("@line", SCHEDULE_GROUP_NAME);
var CurrentWIPQuery = context.Database.SqlQuery<JobList>(@"
...query here...", WIPParam1, WIPParam2);

Метод 2 не позволяет мне получить:

SqlParameter is already contained by another SqlParameterCollection

ошибка (у меня есть другой запрос в другом месте, который использует те же параметры, и они каким-то образом конфликтуют), но запрос все еще пуст.

Что работает Это работает нормально, когда я жестко запрограммирую номер ячейки и строки в своем sql-запросе, поэтому я застрял в том, почему это не работает, когда я их параметризую.

Спасибо за любую помощь в этом!


person Caleb W.    schedule 13.03.2017    source источник


Ответы (1)


Ваш второй метод, вероятно, работает нормально (трудно сказать без запроса и структуры базы данных), но исключение, которое вы получаете, связано с тем, что вы перечисляете результаты несколько раз. Entity Framework использует отложенное выполнение, поэтому фактически не обращается к базе данных, пока вам не понадобятся данные. Это означает, что возврат вашего запроса (в данном случае CurrentWIPQuery) фактически является обещанием пойти и получить данные. Учти это:

var CurrentWIPQuery = ...;

//This should work fine
var count = CurrentWIPQuery.Count(); 

//This will throw an exception
foreach(var thing in CurrentWIPQuery)
{
}

Второй проход через CurrentWIPQuery пытается снова запустить запрос, но поскольку переданные вами объекты SqlParameter уже связаны с другим запросом, он выбрасывает. Самое простое решение — убедиться, что CurrentWIPQuery содержит материализованные данные вместо IEnumerable, добавив ToList() в конец:

var CurrentWIPQuery = context.Database.SqlQuery<JobList>(
    @"...query here...", WIPParam1, WIPParam2)
    ToList();
person DavidG    schedule 13.03.2017
comment
Спасибо за ваш ответ. Я внес изменение, которое вы предложили. Запрос (теперь список, я полагаю) возвращает элементы. Как вы сказали, ничего не выбрасывается. Я рад узнать об этом и о том, как работает отложенное выполнение Entity Framework! Оказывается, мои параметры поменялись местами там, где я вызывал функцию. Не знаю, признавать это или нет, но теперь это работает. Спасибо. - person Caleb W.; 13.03.2017