0

次のコードの何が問題になっていますか?

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から取得されます

例外:

クエリを実行できませんでした [ SELECT C FROM FNHRepository.Entites.Post AS C WHERE UserId=@p0 ] 名前:UserId - 値:3010cd36-539c-4b32-a0fb-976bca58ad38 [SQL: SELECT C FROM FNHRepository.Entites.Post AS C WHEREユーザーID=@p0]

4

1 に答える 1

0

パラメータが文字列型になることを明示的に言っていることに注意してください。これにより、Nhibernate は文字列を単一引用符 ( '') で囲みます。SetParameter を使用する場合は、クエリに一重引用符を設定する必要があります。つまり、クエリは

string.Format("SELECT C FROM {0} AS C WHERE UserId=':UserId'", typeof(T));

したがって、これを使用します:

var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=:UserId", typeof(T)); // you can use SetGuid too, which will again wrap it with quotes
return session.CreateSQLQuery(queryString).SetString("UserId", UserId).List<T>();

また

var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=':UserId'", typeof(T));
return session.CreateSQLQuery(queryString).SetParameter("UserId", UserId).List<T>();

typeof(T).Nameまた、完全修飾名を使用する代わりに使用することをお勧めします。

于 2012-06-25T07:11:13.867 に答える