使用Linq-To-SQL或Entity Framework时,DataContext和生成的实体为延迟执行提供IQueryable接口。它让我编写这样的代码:
public class RPO
{
DataContext dc;
public RPO(){ dc = new DataContext(); }
public IQueryable<Data> ReadData()
{
return dc.Data;
}
}
public class Svc
{
RPO repository;
public Svc() { repository = new RPO(): }
public IQueryable<Data> ReadActiveData()
{
return repository.ReadData().Where(d => d.IsActive.Equals(true));
}
public IQueryable<Data> ReadArchiveData()
{
return repository.ReadData().Where(d => d.IsArchived.Equals(true));
}
}
如果在课程Svc
中我返回DataModel
而不是Data
,则此模型属于appart - 如何尽可能地将IQueryable<T>
保留在链的尽可能远处?< / p>
答案 0 :(得分:3)
您的SVC图层永远不会暴露IQueryable。然后发生的是,实际上是您的服务使用者执行您的查询这是一个糟糕的模式。所以服务应该始终暴露 足以让服务用户工作(显示)的数据。
优选IList或IEnumarable。
答案 1 :(得分:1)
除非你的DTO或ViewModel也实现了IQueryable,否则你不会这样做。一旦你将结果转换成非IQueryable的东西,那就是它。
我知道它被认为是一个糟糕的模式,但是如果你需要IQueryable在你的代码层中做了什么,那么你应该考虑传递它而不是在该层之前转换它。