【发布时间】:2012-06-24 20:35:56
【问题描述】:
下面的代码有什么问题?
public IList<T> GetPostsByUser(object UserId)
{
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=:UserId", typeof(T));
return session.CreateSQLQuery(queryString).SetParameter("UserId", UserId).List<T>();
//return session.QueryOver<T>().List<T>().IsLike(UserId).List();
}
}
}
注意:UserId 被强制转换为对象,但其来源来自 System.GUID
例外:
无法执行查询 [从 FNHRepository.Entites.Post AS C 中选择 C,其中 UserId=@p0] 名称:用户 ID - 值:3010cd36-539c-4b32-a0fb-976bca58ad38 [SQL: SELECT C FROM FNHRepository.Entites.Post AS C WHERE UserId=@p0]
【问题讨论】:
-
@p0的值应该用单引号括起来,例如:'3010cd36-539c-4b32-a0fb-976bca58ad38'。如果您使用.SetGuid()方法而不是.SetParameter(),它将被正确添加。如果您知道UserId将始终为Guid,不知道为什么要坚持使用对象参数。 -
是的,我建议你必须写这个 cmets 作为答案。
-
Baz1nga 已经提供了类似的答案。你可以接受他的回答。
标签: nhibernate c#-4.0 nhibernate-criteria queryover