C# 如何保持IQueryable的优势<;T>;使用ViewModels或DTO而不是ORM生成的实体时?
当使用LINQtoSQL或实体框架时,DataContext和生成的实体为延迟执行提供IQueryable接口。它允许我编写如下代码: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
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
永远不应该超过服务层。