【发布时间】:2014-10-04 07:49:21
【问题描述】:
我捡到了一个使用规范模式的项目,一个我以前没有用过的模式,我不得不去研究这个模式。我注意到它没有 OrderBy 和 Skip/Take 功能,而且我找不到任何显示如何使用该模式实现此功能的地方。
我正在努力思考如何最好地将其添加到规范模式中。但是我遇到了一些问题,比如规范处理“Expression<Func<T, bool>>”,而我认为我不能将它与 orderby 等一起存储
基本上有这样一个类:
public class Specification<T> : ISpecification<T>
{
public Expression<Func<T, bool>> Predicate { get; protected set; }
public Specification(Expression<Func<T, bool>> predicate)
{
Predicate = predicate;
}
public Specification<T> And(Specification<T> specification)
{
return new Specification<T>(this.Predicate.And(specification.Predicate));
}
public Specification<T> And(Expression<Func<T, bool>> predicate)
{
return new Specification<T>(this.Predicate.And(predicate));
}
public Specification<T> Or(Specification<T> specification)
{
return new Specification<T>(this.Predicate.Or(specification.Predicate));
}
public Specification<T> Or(Expression<Func<T, bool>> predicate)
{
return new Specification<T>(this.Predicate.Or(predicate));
}
public T SatisfyingItemFrom(IQueryable<T> query)
{
return query.Where(Predicate).SingleOrDefault();
}
public IQueryable<T> SatisfyingItemsFrom(IQueryable<T> query)
{
return query.Where(Predicate);
}
}
这允许创建规范,传入 where 子句。它还允许使用“And”、“Or”链接规则。例如:
var spec = new Specification<Wave>(w => w.Id == "1").And(w => w.WaveStartSentOn > DateTime.Now);
如何为“OrderBy”和“Take”添加方法?
由于这是现有代码,我无法进行任何会影响现有代码的更改,重构它是一项相当艰巨的工作。所以任何解决方案都需要与现有的东西很好地配合。
【问题讨论】:
标签: c# entity-framework sorting pagination specification-pattern