NHibernate:创建没有会话的 iCriteria
本文关键字:会话 iCriteria 创建 NHibernate | 更新日期: 2023-09-27 18:34:09
我想构造ICriteria并将其传递给函数。该函数将打开会话和事务。然后函数执行 ICriteria.List();并返回对象列表,如下面的代码所示。
我想这样做是因为我只想编写一次using(ISession Session = ...
和Using(ITransaction Transaction = ...
一次来收集对象列表。否则我会重复很多次。
/// <summary>
/// Executes a ICriterion in a new session using a transaction.
/// </summary>
/// <typeparam name="T">The type of object to operate on.</typeparam>
/// <param name="Criterion">The criterion to get the list of objects by.</param>
/// <returns>The result of <c>(List<T>)Session.CreateCriteria(typeof(T)).Add(Criterion).List()</c></returns>
public static List<T> CriterionToList<T>(ICriterion Criterion)
{
List<T> Objects = default(List<T>);
using (ISession Session = SessionFactory.OpenSession())
{
using (ITransaction Transaction = Session.BeginTransaction())
{
Objects = (List<T>)Session.CreateCriteria(typeof(T)).Add(Criterion).List<T>();
Transaction.Commit();
}
}
return Objects;
}
ICriteria.Add() 唯一接受的是ICriterion
。
问题
ICriterion
没有.Add(..
所以我不能这样做:
ICriterion criterion = Restrictions.Eq(Property, Value).Add(...
我怎么还能做到这一点,我应该先把它投ICriteria
这样吗?
ICriterion criterion = ((ICriteria)Restrictions.Eq(Property, Value)).Add(...
注意:问题是我正在使用数据表的大型项目转换为强类型对象(与NHibernate兼容)。所以我有很多很多编译错误,这些错误阻止我测试我的代码而不先转换整个项目。
我认为你可以用DetachedCriteria来实现这一点。语法和用法如下所示:
var det = DetachedCriteria.For<T>.Add(Restrictions.Eq(prop, val));
using (var session = Config.OpenSession())
using (var txn = session.BeginTransaction())
{
var result= det.GetExecutableCriteria(session).List();
}
您可以轻松地将事务封装在一个单独的函数中:
public IList<T> GetList<T>(DetachedCriteria detachedCriteria)
{
IList<T> result;
using (var session = Config.OpenSession())
using (var txn = session.BeginTransaction())
{
result = detachedCriteria.GetExecutableCriteria(session).List<T>();
txn.Commit();
}
return result;
}