Почему мое выражение LINQ не работает в LINQ to SQL? - PullRequest
1 голос
/ 20 сентября 2010
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;
}

Это функция, которая генерирует мое выражение.

и когда я делаю это:

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

Он говорит мне, что параметр w не находится в области видимости.

Итак, вопрос в том, как я могу сгенерировать выражение, которое зависит от того, что мне нужно, и вставить его в запрос LINQ to SQL?

Ответы [ 2 ]

1 голос
/ 21 сентября 2010
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));
}

Эта функция была очень полезной. Он объединил два выражения и построил правильное дерево.

0 голосов
/ 20 сентября 2010

Может быть, вы пытаетесь вернуть Expression.Lambda<T>, а затем назначить его объекту, который является его СЫНОМ в его иерархии (System.Linq.Expressions.Expression<T>)

Пожалуйста, посмотрите на http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.aspx

Надеюсь, что поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...