【问题标题】:Linq wherein extension methods variable p errorsLinq 其中扩展方法变量 p 错误
【发布时间】:2014-06-22 19:17:32
【问题描述】:

我为 where 编写了这个扩展方法;

public static IQueryable<T> WhereIn<T, TValue>(this IQueryable<T> query,
                        IEnumerable<TValue> values, params Expression<Func<T, TValue>>[] valueSelectors)
        {            
            return query.Where(BuildContainsExpression(values, valueSelectors));

        }
        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(
                        IEnumerable<TValue> values, params Expression<Func<TElement, TValue>>[] valueSelector)
        {
            if (null == valueSelector)
            {
                throw new ArgumentNullException("valueSelector");
            }
            if (null == values)
            {
                throw new ArgumentNullException("values");
            }

            Expression<Func<TElement, bool>> predicate = null;

            for (int i = 0; i < valueSelector.Count(); i++)
            {
                var param = valueSelector[i];
                ParameterExpression genericParameter = param.Parameters[0];

                TValue[] enumerable = values as TValue[] ?? values.ToArray();
                if (!enumerable.Any())
                {
                    return e => false;
                }

                if (!enumerable.Any())
                {
                    return e => false;
                }
                IEnumerable<Expression> equals = enumerable.Select(value => (Expression)Expression.Equal(param.Body, Expression.Constant(value, typeof(TValue))));
                Expression body = equals.Aggregate(Expression.Or);
                Expression<Func<TElement, bool>> partialPredicate = Expression.Lambda<Func<TElement, bool>>(body, genericParameter);

                if (predicate == null)
                    predicate = partialPredicate;
                else
                {
                    var orElse = Expression.OrElse(predicate.Body, partialPredicate.Body);
                    predicate = Expression.Lambda<Func<TElement, bool>>(orElse, genericParameter);
                }

            }

            if (predicate != null)
                return predicate;
            return null;
        }

predicate result is = {p => ((((Convert(p.Id) == 1) Or (Convert(p.Id) == 3)) Or (Convert(p.Id) == 5)) OrElse (((p.MemberId == 1) Or (p.MemberId == 3)) Or (p.MemberId == 5)))}

public class OrderDto { public string Id {get;set;} } 

我的输入是:

var list = new List<int?> {1, 3, 5}; 
var orderList = Entity.Order.AsQueryable().WhereIn(list, p => p.Id, p => p.MemberId).Select(t => new OrderDto {Id =t.Id}); –

但我收到此错误;

从范围“”引用的“OrderDto”类型的变量“p”,但未定义

我该如何解决?

【问题讨论】:

  • 最后一行是否与您的代码中的完全相同?
  • 您的输入和预期+实际输出是什么?您没有显示完整的代码。
  • yes 谓词结果看起来像。它看起来像真的。我想看起来像我的 linq。但是当我调用这个谓词时,我得到了从范围''引用的'OrderDto'类型的变量'p',但没有定义那个错误。
  • 我的输入是:var list = new List {1, 3, 5}; var orderList = Entity.Order.AsQueryable().WhereIn(list, p => p.Id, p => p.MemberId).Select(t => new OrderDto {Id =t.Id});
  • 请将其添加到问题中。另外,您可以添加您的 OrderDto 类的定义吗?

标签: c# sql linq extension-methods


【解决方案1】:

您正在重复使用给定表达式中的参数。

ParameterExpression genericParameter = param.Parameters[0];

创建新表达式时,还必须创建新参数。

ParameterExpression genericParameter = new ParameterExpression(...);

请参阅here 了解来自主人的更多信息。

【讨论】:

  • 你能解释一下吗?我写了什么 new ParameterExpression(...);在里面 ?问候
  • ParameterExpression x2 = new ParameterExpression(); x2 = param.Parameters[0];谓词 = Expression.Lambda>(orElse, x2);看起来像吗?
  • @Ben 没有。就像那样,您仍在重复使用相同的参数对象。创建一个新的,基本上是原件的副本。并查看我添加的链接。
  • predicate = Expression.Lambda>(Expression.OrElse(predicate.Body, partialPredicate.Body),predicate.Parameters[0]);我把它写在你的共享链接中,但我又得到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多