添加分页和过滤到典型的Linq规范模式?
我有一个ASP.NET MVC2应用程序,大量使用网格。我想看看是否有办法为典型的规范模式添加有效的分页和过滤。
基本上,启动它的调用看起来像这样:
PatientByUserIdSpecification spc = new PatientByUserIdSpecification(userId);
return this.patientRepository.FindAll(spc).ToList();
现在,我知道我可以在下面执行类似的操作,并根据网格的分页和过滤设置获取行的子集:
return this.patientRepository.FindAll(spc).OrderBy(a => a.Id).Skip(start).Take(limit).ToList();
但是,所有过滤都发生在中间层,userId完全拉动所有记录,随着时间的推移,每个用户可以增长到数百条记录。这意味着大量低效的网络干扰。因此,显然,需要降低标准,以便NHibernate和Linq生成的SQL更好地过滤。
LinqRepository代码基本上是:
public IQueryable<T> FindAll(ILinqSpecification<T> specification)
{
return specification.SatisfyingElementsFrom(this.Session.Linq<T>());
}
public virtual IQueryable<TResult> SatisfyingElementsFrom(IQueryable<T> candidates)
{
if (this.MatchingCriteria != null)
{
return candidates.Where(this.MatchingCriteria).ToList().ConvertAll(this.ResultMap).AsQueryable();
}
return candidates.ToList().ConvertAll(this.ResultMap).AsQueryable();
}
例如,PatientByUserIdSpecification具有MatchingCriteria:
public override Expression<Func<Patient, bool>> MatchingCriteria
{
get { return p => p.Cases.Any(c => c.CaseUsers.Any(x => (x.User.Id == this.userId))); }
}
我以为有了下面会这样做,但查询仍然太宽泛。
public virtual IQueryable<TResult> SatisfyingElementsFrom(IQueryable<T> candidates, int start, int limit, string sort, string dir)
{
if (this.MatchingCriteria != null)
{
return candidates.Where(this.MatchingCriteria).Skip(start).Take(limit).ToList().ConvertAll(this.ResultMap).AsQueryable();
}
return candidates.ToList().ConvertAll(this.ResultMap).AsQueryable();
}
我可以和如何设置生成更好的SQL的能力?
没有找到相关结果
已邀请:
1 个回复
砷竣阿
您需要重构以删除它们并针对SQL对象的模式运行Dynamic LINQ,以便能够在服务器端进行过滤。