2010-09-20 2 views
1
private System.Linq.Expressions.Expression<Func<ActionLogs, bool>> GetExpression() 
{ 
    Expression<Func<ActionLogs, bool>> expr = w => w.ID != -1; 
    if (ActionDate != null) 
    { 
     Expression<Func<ActionLogs, bool>> byDate = w => w.DateAction == ActionDate; 
     var body = Expression.AndAlso(expr.Body, byDate.Body); 
     expr = Expression.Lambda<Func<ActionLogs, bool>>(body, expr.Parameters[0]); 
    } 

    if (ActionType != ActionTypeEnum.Empty) 
    { 
     Expression<Func<ActionLogs, bool>> byActionType = w => w.ActionTypeID == (int)ActionType; 
     var body = Expression.AndAlso(expr.Body, byActionType.Body); 
     expr = Expression.Lambda<Func<ActionLogs, bool>>(body, expr.Parameters[0]); 
    } 

    if (!String.IsNullOrWhiteSpace(AuthorLogin)) 
    { 
     Expression<Func<ActionLogs, bool>> byLogin = w => w.User.LoginName == AuthorLogin; 
     var body = Expression.AndAlso(expr.Body, byLogin.Body); 
     expr = Expression.Lambda<Func<ActionLogs, bool>>(body, expr.Parameters[0]);    
    } 

    if (!String.IsNullOrWhiteSpace(AdditionalInfo)) 
    { 
     Expression<Func<ActionLogs, bool>> byAdditionalInfo = w => w.DescriptionText.Contains(AdditionalInfo); 
     var body = Expression.AndAlso(expr.Body, byAdditionalInfo.Body); 
     expr = Expression.Lambda<Func<ActionLogs, bool>>(body, expr.Parameters[0]); 
    } 

    return expr; 
} 

C'est la fonction qui génère mon expression.Pourquoi mon expression LINQ ne fonctionne pas dans LINQ to SQL?

et quand je fais ceci:

System.Linq.Expressions.Expression<Func<ActionLogs, bool>> expr = GetExpression(); 
result = blablabla.Where(expr); 

Il me dit que le paramètre « w » est pas portée.

Donc la question est, comment je peux générer mon expression, cela dépend de quelque chose dont j'ai besoin, et le coller dans une requête LINQ to SQL?

+1

sur quelle ligne lance-t-elle cette erreur? J'ai besoin de savoir où dans l'exemple ci-dessus il lance cette erreur, pas "ligne 364" –

+0

ici: résultat = blablabla.where (expr); – Dmitry

Répondre

1
public Expression<Func<T, bool>> Combine<T>(Expression<Func<T, Boolean>> first, Expression<Func<T, Boolean>> second) 
{ 
    var toInvoke = Expression.Invoke(second, first.Parameters.Cast<Expression>()); 
    return (Expression.Lambda<Func<T, Boolean>>(Expression.AndAlso(first.Body, toInvoke), first.Parameters)); 
} 

Cette fonction a été très utile. Il combinait deux expressions et construisait un arbre correct.

+0

N'oubliez pas d'accepter votre propre réponse comme correcte – abatishchev

0

pourrait-il que vous essayez de retourner un Expression.Lambda<T> puis l'assigner à un objet qui est un fils de celui-ci sur sa hiérarchie (System.Linq.Expressions.Expression<T>)

S'il vous plaît jeter un oeil à http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.aspx

espoir que aide,

+0

mais quand je fais comme ceci: Expression > expr = w => w.ID! = -1; résultat = blablabla.where (expr); Ça marche. J'ai essayé de comparer ces deux expressions lors du débogage, et j'ai trouvé ce corps de différents types. Mais je ne pourrais pas trouver la solution de cette situation ( – Dmitry