使用Linq-To SQL或实体框架时,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
,那么这个模型就失效了——我如何将IQueryable<T>
保持在尽可能远的链下?
SVC层永远不应该暴露IQueryable。然后发生的情况是,实际上是您的服务消费者执行了您的查询,这是一种糟糕的模式。所以服务应该总是公开足以供服务用户工作(显示)的数据。
最好是IList或IE号码。
除非您的DTO或ViewModel也实现了IQueryable,否则您不会。一旦你把结果转换成无法查询的东西,就这样了。
我知道这被认为是一个糟糕的模式,但如果你需要IQueryable在代码的那个层中做什么,那么你应该考虑只传递它,而不是在那个层之前转换它。