获取错误 "The parameter was not bound in the specified LINQ to Entities query expression."
Getting error "The parameter was not bound in the specified LINQ to Entities query expression."
我正在尝试创建一种通用方法来查找日期在用户指定日期范围列表内的交易。这是我的代码:
var closeDates = new List<Range<DateTime>>
{{ new Range<DateTime>{ Start = DateTime.Now, End = DateTime.Now.AddDays(1) }};
var deals = dbContext.Deals.AsQueryable();
deals = _helperService.ApplyDateRanges(deals, deal => deal.ClosedDate, closeDates);
_helperService 方法:
public IQueryable<T> ApplyDateRanges<T>(IQueryable<T> query, Expression<Func<T, DateTime>> dateSelector, IEnumerable<Range<DateTime>> dates)
{
var enumerable = dates as Range<DateTime>[] ?? dates.ToArray();
Expression<Func<T, Range<DateTime>, bool>> matcher =
(row, rangeItem) => (rangeItem.Start == null || dateSelector.Invoke(row) >= rangeItem.Start) &&
(rangeItem.End == null || dateSelector.Invoke(row) < rangeItem.End.Value.AddDays(1));
var expr = PredicateBuilder.False<T>();
foreach (var dt in enumerable)
{
expr = expr.Or(d => matcher.Invoke(d, dt));
}
return query.AsExpandable().Where(expr.Expand());
}
但我收到错误:The parameter 'deal' was not bound in the specified LINQ to Entities query expression.
这是什么原因造成的?
异常信息表示dateSelector
参数没有正确反弹。由于涉及第三方包,我无法判断是什么原因造成的。
但我想这与您的有关。我打算向您建议另一个简单的基于手动表达式构建的工作解决方案,不涉及第三方包。在这里(假设 Range
class Start/End
成员的类型为 DateTime?
):
public static class QueryableExtensions
{
public static IQueryable<T> WhereIn<T>(IQueryable<T> source, Expression<Func<T, DateTime>> dateSelector, IEnumerable<Range<DateTime>> ranges)
{
var filter = ranges == null ? null : ranges.Select(range =>
{
var startFilter = range.Start != null ? Expression.GreaterThanOrEqual(dateSelector.Body, Expression.Constant(range.Start.Value.Date)) : null;
var endFilter = range.End != null ? Expression.LessThan(dateSelector.Body, Expression.Constant(range.End.Value.Date.AddDays(1))) : null;
return startFilter == null ? endFilter : endFilter == null ? startFilter : Expression.AndAlso(startFilter, endFilter);
})
.Where(item => item != null)
.Aggregate(Expression.OrElse);
return filter != null ? source.Where(Expression.Lambda<Func<T, bool>>(filter, dateSelector.Parameters[0])) : source;
}
}
您可以像这样简单地使用它(不需要辅助服务实例,遵循 LINQ 精神):
var deals = dbContext.Deals.WhereIn(deal => deal.ClosedDate, closeDates);
我正在尝试创建一种通用方法来查找日期在用户指定日期范围列表内的交易。这是我的代码:
var closeDates = new List<Range<DateTime>>
{{ new Range<DateTime>{ Start = DateTime.Now, End = DateTime.Now.AddDays(1) }};
var deals = dbContext.Deals.AsQueryable();
deals = _helperService.ApplyDateRanges(deals, deal => deal.ClosedDate, closeDates);
_helperService 方法:
public IQueryable<T> ApplyDateRanges<T>(IQueryable<T> query, Expression<Func<T, DateTime>> dateSelector, IEnumerable<Range<DateTime>> dates)
{
var enumerable = dates as Range<DateTime>[] ?? dates.ToArray();
Expression<Func<T, Range<DateTime>, bool>> matcher =
(row, rangeItem) => (rangeItem.Start == null || dateSelector.Invoke(row) >= rangeItem.Start) &&
(rangeItem.End == null || dateSelector.Invoke(row) < rangeItem.End.Value.AddDays(1));
var expr = PredicateBuilder.False<T>();
foreach (var dt in enumerable)
{
expr = expr.Or(d => matcher.Invoke(d, dt));
}
return query.AsExpandable().Where(expr.Expand());
}
但我收到错误:The parameter 'deal' was not bound in the specified LINQ to Entities query expression.
这是什么原因造成的?
异常信息表示dateSelector
参数没有正确反弹。由于涉及第三方包,我无法判断是什么原因造成的。
但我想这与您的Range
class Start/End
成员的类型为 DateTime?
):
public static class QueryableExtensions
{
public static IQueryable<T> WhereIn<T>(IQueryable<T> source, Expression<Func<T, DateTime>> dateSelector, IEnumerable<Range<DateTime>> ranges)
{
var filter = ranges == null ? null : ranges.Select(range =>
{
var startFilter = range.Start != null ? Expression.GreaterThanOrEqual(dateSelector.Body, Expression.Constant(range.Start.Value.Date)) : null;
var endFilter = range.End != null ? Expression.LessThan(dateSelector.Body, Expression.Constant(range.End.Value.Date.AddDays(1))) : null;
return startFilter == null ? endFilter : endFilter == null ? startFilter : Expression.AndAlso(startFilter, endFilter);
})
.Where(item => item != null)
.Aggregate(Expression.OrElse);
return filter != null ? source.Where(Expression.Lambda<Func<T, bool>>(filter, dateSelector.Parameters[0])) : source;
}
}
您可以像这样简单地使用它(不需要辅助服务实例,遵循 LINQ 精神):
var deals = dbContext.Deals.WhereIn(deal => deal.ClosedDate, closeDates);