首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate:创建没有会话的iCriteria

NHibernate:创建没有会话的iCriteria
EN

Stack Overflow用户
提问于 2013-10-07 12:54:08
回答 1查看 1.1K关注 0票数 0

我想构造ICriteria并把它传递给一个函数。该函数将打开一个会话和事务。然后,函数执行ICriteria.List();并返回对象列表,如下所示。

我之所以想这样做,是因为我只想为收集对象列表编写一次using(ISession Session = ...Using(ITransaction Transaction = ...。否则我重复了很多次。

代码语言:javascript
复制
    /// <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(..,所以i不能这样做:

代码语言:javascript
复制
ICriterion criterion = Restrictions.Eq(Property, Value).Add(...

我如何才能做到这一点,我应该先把它像这样抛给ICriteria吗?

代码语言:javascript
复制
ICriterion criterion = ((ICriteria)Restrictions.Eq(Property, Value)).Add(...

注意:问题在于,我正在将使用DataTables的大型项目转换为强类型对象(与NHibernate兼容)。因此,我有许多编译错误,这些错误使我无法在不首先转换整个项目的情况下测试我的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-07 13:49:54

我认为您可以通过DetachedCriteria来实现这一点。语法和用法如下:

代码语言:javascript
复制
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();
}

您可以轻松地将事务封装在一个单独的函数中:

代码语言:javascript
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19225477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档