2014-03-20 5 views
1

вот моя ситуация, я хочу использовать общий reposity для запроса данных, вот код:NHibernate родового reposity queryover

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) 

, кажется, что не может распознать пользователь уага в фильтре, но когда я изменить фильтр:

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

он работает нормально, Кто-нибудь знает, как это does't работу в первой попытке, и как решить эту проблему

ответ

0

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")); 
+0

Большое спасибо, он работает! @Najera – TommyLike

0

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/

+0

Речь идет не о LINQ к NH. –

+0

Речь идет о queryover, но он также использует тот же linq для преобразования hql, который я предполагаю. –

Смежные вопросы