在使用ViewModel或DTO而不是ORM生成的实体时,如何保持IQueryable <t>的优点?</t>

时间:2011-06-28 17:02:28

标签: c# .net design-patterns orm

使用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>

2 个答案:

答案 0 :(得分:3)

您的SVC图层永远不会暴露IQueryable。然后发生的是,实际上是您的服务使用者执行您的查询这是一个糟糕的模式。所以服务应该始终暴露 足以让服务用户工作(显示)的数据。

优选IList或IEnumarable。

答案 1 :(得分:1)

除非你的DTO或ViewModel也实现了IQueryable,否则你不会这样做。一旦你将结果转换成非IQueryable的东西,那就是它。

我知道它被认为是一个糟糕的模式,但是如果你需要IQueryable在你的代码层中做了什么,那么你应该考虑传递它而不是在该层之前转换它。