我从一个IEnumerable开始,并希望通过几个包含LINQ-to-SQL查询的方法来运行它,这些方法将过滤结果集。某些方法将对原始结果集进行操作,其他方法将对进一步过滤的结果集进行操作。但是,我想保留所提供的IEnumerable A和过滤的IEnumerable B的Excepts(反交叉?)的计数,以便计数可以在所有过滤方法结束时通过电子邮件发送。例如,如果方法A提供了60个记录的集合,但在过滤之后,结果将减少到20个记录,我想在某处存储数字40。
跟踪计数和集合/查询的推荐方法是什么?我正在考虑使用IQueryable并使用out参数在方法中执行Count()来跟踪计数,但这看起来很麻烦。是否有某种设计模式适合这个过程?
答案 0 :(得分:1)
interface IFilter<T>
{
IQueryable<T> Filter(IQueryAble<T> data);
}
interface IResultSet<T>
{
int OrignalCount { get; }
int FilteredCount { get; }
IEnumerable<T> Result { get; }
void AddFilter(IFilter<T> filter);
}
和IResultSet的实现:
class ResultSet<T> : IResultSet<T>
{
private IQueryable<T> data;
private List<IFilter> filters = new List<IFilter>();
public int OriginalCount {get; private set;}
public int FilteredCount
{
get { return Result.Count(); }
}
public IEnumerable<T> Result
{
get
{
IQueryable data = this.data;
foreach(IFilter filter in filters)
{
data = filter.Filter(data);
}
return data;
}
}
//constructor
public ResultSet<T>(IQueryable<T> data)
{
this.data = data;
this.OriginalCount = data.Count();
}
public void AddFilter(IFilter<T> filter)
{
this.filters.Add(filter);
}
}