SubSonic3 SetExpression задача - PullRequest
0 голосов
/ 10 января 2011

Следующий запрос SubSonic3 выдает ошибку:

Db.Update<Tag>()
    .SetExpression("Popularity")
    .EqualTo("Popularity+1")
    .Where<Tag>(x => x.TagId == tagId)
    .Execute();

Ошибка: ошибка: System.FormatException: не удалось преобразовать значение параметра из строки в Int32.

Созданный sql - это нормально, но набор параметров содержит два параметра, которые необходимо установить.

UPDATE [Tagging].[Tag] 
SET Popularity=Popularity+1
WHERE [Tagging].[Tag].[TagId] = @0

Один из параметров устанавливает @up_Popularity на «Популярность + 1». Поскольку это первый устанавливаемый параметр, sql попытайтесь присвоить этой строке 'Популярность + 1' целое число.

Это ошибка или я что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 10 января 2011
Db.Update<Tag>()
    .SetExpression("Popularity = Popularity + 1")
    .Where<Tag>(x => x.TagId == tagId)
    .Execute();

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

new CodingHorror("UPDATE Tags SET Popularity = Popularity + 1 WHERE @1", 
  tagId).Execute();
0 голосов
/ 10 января 2011

Я бы удивился, если бы это сработало. Когда мне нужно, чтобы строка была оценена как часть SQL (а не SubSonic), мне почти всегда приходится использовать CodingHorror .

Однако вы должны быть в состоянии сделать это с помощью отдельного запроса. Что-то вроде:

Db.Update<Tag>()
  .Set("Popularity")
  .EqualTo(Tag.SingleOrDefault(t => t.TagId == tagId).Popularity + 1)
  .Where<Tag>(x => x.TagId == tagId)
  .Execute();
...