Как я могу откатывать Запрос на обновление в SQL-сервере 2005?

Вы должны знать о различиях между IEnumerable и IQueryable.

Объект IEnumerable содержит все для перечисления в последовательности. Вы можете запросить первый элемент, и как только у вас появится элемент, вы можете запросить следующий, если есть следующий. IEnumerable должен обрабатываться локально вашим процессом.

Перечисление на самом низком уровне выполняется путем запроса перечислителя и повторного вызова MoveNext до тех пор, пока вам больше не понадобятся элементы. Например:

IEnumerable students = ...
IEnumerator studentEnumerator = students.GetEnumerator();
while (studentEnumerator.MoveNext())
{
    // there is still a Student to process:
    Student student = studentEnumerator.Current;
    ProcessStudent(student);
}

Вы можете сделать это явно, или неявно вызвать его, используя foreach или одну из функций LINQ.

С другой стороны, IQueryable предназначен для обработки другим процессом, обычно системой управления базами данных. IQueryable содержит Expression и Provider. Expression выражает запрос, который должен быть выполнен в некотором общем формате. Provider знает, кто должен выполнять запрос (обычно это система управления базами данных), и язык, который использует этот процесс (обычно что-то вроде SQL).

Как только вы начинаете перечисление, вызывая GetEnumerator, Expression отправляется Provider, который пытается перевести Expression в SQL и выполняет запрос. Извлеченные данные помещаются в перечислимую последовательность, и перечислитель возвращается.

Вернуться к вашему вопросу

Проблема в том, что SQL не знает ConvertPocoToModel. Следовательно, ваш провайдер не может конвертировать Expression. Компилятор не может обнаружить это, потому что он не знает, насколько умен ваш Provider. Вот почему вы не получите эту ошибку, пока не позвоните GetEnumerator, в вашем случае - ToList.

Решение

Решение - создать функцию, которая изменит выражение. Самый простой способ - это функция расширения. См. Методы расширения демистифицированы . Таким образом, вы можете использовать его как любой другой метод LINQ:

public static IQueryable ToEventModels(this IQueryable tsrEvents)
{
    return tsrEvent.Select(tsrEvent =>  new EventModel
    {
        Id = tsrEvent.EventId,
        Name = tsrEvent.EventName,
        Capacity = tsrEvent.EventCapacity,
        Active = tsrEvent.EventActive                
    };
}

Обратите внимание, что я опускаю () в конструкторе: SQL не может вызывать конструкторы!

Использование: [1142 ]

var result = dbContext.TsrEvents
     .Where(tsrEvent => tsrEvent.Active && tsrEvent.Date == Today)
     .ToEventModels()
     .GroupBy(...)
     ... etc

Или, если ваш GetEvents возвращает IQueryable

return eventRepository.GetEvents(_customerId, showInactive, showPastEvents)
      .ToEventModels();

Заключительное замечание

Лучше позволить вашим данным- Функции fetch возвращают IQueryable<...> и IEnumerable<...> как можно дольше. Пусть только конечный пользователь материализует запрос. Было бы напрасной тратой вычислительной мощности, если вы выполняете ToList(), а ваш абонент хочет только FirstOrDefault()

18
задан Anas Alweish 25 May 2019 в 23:28
поделиться

6 ответов

begin transaction

// execute SQL code here

rollback transaction

Если Вы уже выполнили запрос и хотите откатывать его, к сожалению, Ваша единственная реальная опция состоит в том, чтобы восстановить резервное копирование базы данных. Если Вы используете Полное резервное копирование, то необходимо смочь восстановить базу данных к отдельному моменту вовремя.

32
ответ дан 30 November 2019 в 05:48
поделиться

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

1
ответ дан 30 November 2019 в 05:48
поделиться

Вам нужен этот инструмент, и можно найти транзакцию и инвертировать ее.

Журнал ApexSQL

28
ответ дан 30 November 2019 в 05:48
поделиться

Можно откатывать операторы, которые Вы выполнили в рамках транзакции. Вместо того, чтобы фиксировать транзакцию, откатывайте транзакцию.

Если Вы обновили что-то и хотите откатывать те обновления, и Вы не сделали этой внутренней части (еще фиксировавшая) транзакция, то я думаю, что это хотя удача...

(Вручную восстановление, или, восстанавливает резервные копии),

5
ответ дан 30 November 2019 в 05:48
поделиться

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

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

0
ответ дан 30 November 2019 в 05:48
поделиться

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

1
ответ дан 30 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: