[英]nhibernate generic repository queryover
here is my situation,I want to use a generic reposity to query data,here is the code: 这是我的情况,我想使用通用存储库查询数据,这是代码:
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);
}
}
but when I use the method such as: 但是当我使用以下方法时:
Expression<Func<User,bool>> filter = user => String.Compare(user.Name, “TommyLike”, System.StringComparison.OrdinalIgnoreCase) == 0;
var result = _kernel.Get<IReposity<User>>.SingleOrDefault(filter)
it seems that can not recognise the var user in the filter,but when i change the filter to: 似乎无法识别过滤器中的var用户,但是当我将过滤器更改为:
filter = user => user.Name == "TommyLike"
it runs ok,does anybody know how it does't work in the first try?and how to fix the problem? 它运行正常,有人知道它在第一次尝试中不起作用吗?以及如何解决该问题?
NHibernate linq provider does not support this case : NHibernate linq提供程序不支持这种情况:
String.Compare(user.Name, “TommyLike”, System.StringComparison.OrdinalIgnoreCase) == 0
Not all .net methods can be translated to sql, however it is possible to make registrations for your own methods 并非所有.net方法都可以转换为sql,但是可以为您自己的方法进行注册
http://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/ http://sentinel101.wordpress.com/2010/12/30/extend-nhibernate-linq-for-regex-matching/
QueryOver
support that with this syntax: QueryOver
支持使用以下语法:
var user = session.QueryOver<User>()
.WhereRestrictionOn(x => x.Name).IsInsensitiveLike("TommyLike")
This must work: 这必须工作:
public T SingleOrDefault(Func<IQueryOver<T, T>, IQueryOver<T, T>> filter)
{
return Transact(() =>
{
var query = session.QueryOver<T>();
query = filter(query);
return query.SingleOrDefault();
});
}
Calling it is almost the same: 调用几乎是相同的:
var result = _kernel.Get<IReposity<User>>.SingleOrDefault(
query => query.WhereRestrictionOn(x => x.Name).IsInsensitiveLike("TommyLike"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.