我遵循here中描述的规范模式实现。我有一个类似这样的存储库方法:
public IEnumerable<MyDto> Find(Specification<Dto> specification)
{
return myDbContext.MyDtos.Where(specification.ToExpression()).Take(20).ToList();
}
如果我使用普通的非复合规范,它就可以正常工作,但是以下情况失败,并显示消息“在指定的LINQ to Entities查询表达式中未绑定参数'r'。”]
Specification<MyDto> spec = new Spec1(someCriterion)
.And(new Spec2(someCriterion))
.And(new Spec3(someCriterion))
// etc...
var myDtos = repo.Find(spec);
到目前为止,我所读到的内容与所有表达式的参数引用都不相同,但是我不确定如何解决此问题。
供参考,这是我的代码中AndSpecification<T>
类的外观:
public class AndSpecification<T> : Specification<T>
{
private readonly Specification<T> _left;
private readonly Specification<T> _right;
public AndSpecification(Specification<T> left, Specification<T> right)
{
_left = left;
_right = right;
}
public override Expression<Func<T, bool>> ToExpression()
{
Expression<Func<T, bool>> leftExpression = _left.ToExpression();
Expression<Func<T, bool>> rightExpression = _right.ToExpression();
BinaryExpression andExpression = Expression.AndAlso(
leftExpression.Body, rightExpression.Body);
return Expression.Lambda<Func<T, bool>>(
andExpression, leftExpression.Parameters.Single());
}
}
问题出在您的ToExpression
方法中。