当前位置:  开发笔记 > 编程语言 > 正文

要返回IQueryable <T>或不返回IQueryable <T>

如何解决《要返回IQueryable<T>或不返回IQueryable<T>》经验,为你挑选了2个好方法。

我有一个存储库类,它包装了我的LINQ to SQL数据上下文.存储库类是一个业务线类,包含所有数据层逻辑(以及缓存等).

这是我的repo界面的v1.

public interface ILocationRepository
{
    IList FindAll();
    IList FindForState(State state);
    IList FindForPostCode(string postCode);
}

但是为了处理FindAll的分页,我正在讨论是否要公开IQueryable 而不是IList来简化分页等环境的接口.

从数据仓库中暴露IQueryable的利弊是什么?

很感谢任何形式的帮助.



1> Marc Gravell..:

专业人士; 可组合:

呼叫者可以添加过滤器

呼叫者可以添加分页

呼叫者可以添加排序

等等

缺点; 非可测性:

您的存储库不再适用于单元可测试; 你不能依赖:它工作,b:它做什么 ;

调用者可以添加一个不可翻译的函数(即没有TSQL映射;在运行时中断)

调用者可以添加一个过滤器/排序,使其像狗一样运行

由于调用者希望IQueryable是可组合的,它排除了不可组合的实现 - 或者它迫使你为它们编写自己的查询提供者

这意味着您无法优化/分析DAL

为了稳定,我已经采取暴露IQueryableExpression<...>在我的存储库.这意味着我知道存储库的行为方式,而我的上层可以使用模拟而不用担心"实际的存储库是否支持这个?" (强制集成测试).

我仍然使用IQueryable内部信息库-但不下来的边界.我在这里发表了关于这个主题的更多想法.将分页参数放在存储库接口上同样容易.您甚至可以使用扩展方法(在接口上)添加可选的分页参数,这样具体类只有1个方法可以实现,但调用者可能有2或3个重载.


如果使用得当,`IEnumerable `就可以了 - 但主要用于大数据.对于常规查询,我更喜欢封闭集(数组/列表/等).特别是,我现在正在使用MVC,我希望**控制器**获取所有数据 - 不要将它推迟到视图 - 否则你无法完全测试...
...控制器,因为你实际上没有证明它获取数据(因为`IEnumerable `通常与延迟执行一起使用).如果repo返回IList (或类似),那么你就知道**你已经获得了数据.
使用IQueryable ,可以更改实际查询.使用IEnumerable ,不那么 - 但仍然是:获取数据是控制器的责任,而不是视图.

2> Akash Kava..:

正如前面的回答所提到的,暴露IQueryable可以让调用者可以使用IQueryable本身,这可能会变得很危险.

封装业务逻辑的首要任务是保持数据库的完整性.

您可以继续公开IList,可能会更改您的参数如下,这就是我们正在做的事情......

public interface ILocationRepository
{
    IList FindAll(int start, int size);
    IList FindForState(State state, int start, int size);
    IList FindForPostCode(string postCode, int start, int size);
}

如果size == -1则返回all ...

替代方式......

如果您仍想返回IQueryable,那么您可以在函数内返回List的IQueryable ..例如......

public class MyRepository
{
    IQueryable FindAll()
    {
        List myLocations = ....;
        return myLocations.AsQueryable;
        // here Query can only be applied on this
        // subset, not directly to the database
    }
}

第一种方法优于内存,因为您将返回较少的数据而不是全部.


哎呀,你的第二种方法就是杀手锏!它会将所有结果拉入内存,然后对它们执行LINQ.我从来没有找到真正的理由使用`AsQueryable`来说实话.我甚至不确定它为什么存在.它不会突然将您的List转换为IQueryable并允许您构建发送到您的数据存储的表达式树,那么重点是什么?
推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有