C# 如何保持IQueryable的优势<;T>;使用ViewModels或DTO而不是ORM生成的实体时?

C# 如何保持IQueryable的优势<;T>;使用ViewModels或DTO而不是ORM生成的实体时?,c#,.net,design-patterns,orm,C#,.net,Design Patterns,Orm,当使用LINQtoSQL或实体框架时,DataContext和生成的实体为延迟执行提供IQueryable接口。它允许我编写如下代码: public class RPO { DataContext dc; public RPO(){ dc = new DataContext(); } public IQueryable<Data> ReadData() { return dc.Data; } } public class Sv

当使用LINQtoSQL或实体框架时,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)); 
    }
}
公共类RPO
{
数据上下文dc;
公共RPO(){dc=new DataContext();}
公共可读取数据()
{
返回dc.数据;
}
}
公共类Svc
{
RPO存储库;
public Svc(){repository=new RPO():}
公共IQueryable ReadActiveData()
{ 
返回repository.ReadData(),其中(d=>d.IsActive.Equals(true));
}
公共可读取的ReadArchiveData()
{ 
返回repository.ReadData(),其中(d=>d.IsArchived.Equals(true));
}
}

如果在类
Svc
中,我返回
DataModel
而不是
Data
,那么这个模型就很明显了--我怎样才能使
IQueryable
尽可能地保持在链的最底层呢?

你的Svc层不应该暴露IQueryable。然后发生的事情是,实际上是您的服务消费者执行了您的查询,这是一种糟糕的模式。所以服务应该总是公开 足以供服务用户使用(显示)的数据


最好是IList或IEnumerable

除非您的DTO或ViewModel也实现了IQueryable,否则您不会这样做。一旦你把结果转化成不可理解的东西,就这样了


我知道它被认为是一个坏的模式,但是如果你需要在代码的那一层做什么,那么你应该考虑只传递它而不是在那个层之前转换它。< /P>我称它为代码> SVC 这是真正的“服务”内部使用的代码,它是公共API的一部分。它真的应该被称为BusinessServices之类的东西。但我想这并不重要,因为您是说,

IQueryable
永远不应该超过服务层。