2015-12-18 7 views
1

Je suis en train de faire une requête someProperty.contains(string) || otherProperty.contains(string) donc j'ai trouvé ce qui suit:NHibernate où les restrictions avec un alias

.where(
restrictions.on<type>(x => x.property).IsLike(string) || 
restrictions.on<type>(x => x.prop2).IsLike(string) 
) 

cependant, j'ai un alias avant celui-ci où pour l'une des propriétés d'un rejoindre:

session.QueryOver<Trade>() 
    .JoinAlias(x => x.TradeType,() => ttypeAlias) 
    .Where(
     Restrictions.On<Trade>(c => c.Nickname).IsLike("%" + searchString + "%") || 
     Restrictions.On<TradeType>(() => ttypeAlias.TradeTypeName).IsLike("%" + searchString + "%") || 
    ) 

mais je reçois une erreur sur la ligne de restriction à l'alias:

type délégué n'accepte pas 0 arguments

() => ttypeAlias.TradeTypeName 

comment puis-je intégrer cet alias?

Répondre

2

C'est la syntaxe du .On() utilisé ci-dessus:

/// <summary> 
/// Build an ICriterion for the given property 
/// </summary> 
/// <param name="expression">lambda expression identifying property</param> 
/// <returns>returns LambdaRestrictionBuilder</returns> 
public static LambdaRestrictionBuilder On<T>(Expression<Func<T, object>> expression) 
{ 
    ExpressionProcessor.ProjectionInfo projection = ExpressionProcessor.FindMemberProjection(expression.Body); 
    return new LambdaRestrictionBuilder(projection); 
} 

Et qui nous donne la réponse:

expression passée doit avoir un argument (qui ne doit être utilisé)

La syntaxe, qui fonctionnera, pourrait ressembler à ceci:

// no argument - it is wrong 
// Restrictions.On<TradeType>(() => ttypeAlias.TradeTypeName)... 

// here we expect one argument, and naming his lo-dash - is convention to say 
// it won't be used, it is there just to fulfill all the rules 
Restrictions.On<TradeType>(_ => ttypeAlias.TradeTypeName)...