【问题标题】:nhibernate generic repository queryovernhibernate 通用存储库查询
【发布时间】:2014-03-20 14:11:01
【问题描述】:

这是我的情况,我想使用通用存储库来查询数据,代码如下:

public T SingleOrDefault(Expression<Func<T, bool>> filter)
{
    return Transact(() => session.QueryOver<T>().Where(filter).List().FirstOrDefault());
}   
protected virtual TResult Transact<TResult>(Antlr.Runtime.Misc.Func<TResult> func)
{
    try
    {
        if (!session.Transaction.IsActive)
        {
            TResult result;
            using (var tr = session.BeginTransaction())
            {
                result = func.Invoke();
                tr.Commit();
            }
            return result;
        }
        return func.Invoke();
    }
    catch (Exception e)
    {
        Log.Error(e);
        throw new Exception(e.Message);
    }
} 

但是当我使用如下方法时:

Expression<Func<User,bool>> filter = user => String.Compare(user.Name, “TommyLike”, System.StringComparison.OrdinalIgnoreCase) == 0;
var result = _kernel.Get<IReposity<User>>.SingleOrDefault(filter)

似乎无法识别过滤器中的var用户,但是当我将过滤器更改为:

filter = user => user.Name == "TommyLike"

它运行正常,有谁知道它在第一次尝试时如何不起作用?以及如何解决问题?

【问题讨论】:

    标签: c# generics nhibernate ninject queryover


    【解决方案1】:

    QueryOver 支持这种语法:

    var user = session.QueryOver<User>()
        .WhereRestrictionOn(x => x.Name).IsInsensitiveLike("TommyLike")
    

    这必须有效:

    public T SingleOrDefault(Func<IQueryOver<T, T>, IQueryOver<T, T>> filter)
    {
        return Transact(() =>
        {
            var query = session.QueryOver<T>();
    
            query = filter(query);
    
            return query.SingleOrDefault();
        });
    }
    

    调用它几乎是一样的:

    var result = _kernel.Get<IReposity<User>>.SingleOrDefault(
        query => query.WhereRestrictionOn(x => x.Name).IsInsensitiveLike("TommyLike"));
    

    【讨论】:

      【解决方案2】:

      NHibernate linq 提供程序不支持这种情况:

      String.Compare(user.Name, “TommyLike”, System.StringComparison.OrdinalIgnoreCase) == 0
      

      并非所有 .net 方法都可以转换为 sql,但是可以为您自己的方法进行注册

      http://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/

      【讨论】:

      • 问题不在于 LINQ to NH。
      • 它是关于查询的,但它也使用我认为相同的 linq to hql 转换。
      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多