如何在<T>使用视图模型或DTO而不是ORM生成的实体时保持IQueryable的优势?



使用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在代码的那个层中做什么,那么你应该考虑只传递它,而不是在那个层之前转换它。

最新更新