SubSonic3 SetExpression问题

时间:2011-01-10 10:40:53

标签: subsonic3

下一个SubSonic3查询给出了一个错误:

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

错误:失败:System.FormatException:无法将参数值从String转换为Int32。

生成的sql是正常的,但参数集合包含两个需要设置的参数。

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

其中一个参数将@up_Popularity设置为'Popularity + 1'。由于这是第一个设置的参数,因此sql triese将此字符串'Popularity + 1'分配给整数。

这是一个错误还是我做错了什么?

2 个答案:

答案 0 :(得分:1)

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();

答案 1 :(得分:0)

如果这应该有效,我会感到惊讶。当我需要将一个字符串作为SQL的一部分(而不是SubSonic)进行评估时,我几乎总是不得不使用CodingHorror

但是,您应该可以使用单独的查询来执行此操作。类似的东西:

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