c# - List 之间的执行差异和 IQueryable
问题描述
我正在尝试编写一个通用数据库更新方法,该方法可以利用 IQueryable 在处理之前减少返回实体的数量。所以对于部分代码,我尝试了这个(b.ToType()
返回一个P
):
IQueryable<B> bs = bcontext.Set<B>();
IQueryable<P> ps = pcontext.Set<P>();
List<P> inserts = ps.Except(bs.Select(b => b.ToType())).Take(500).ToList();
当我这样写时,我得到System.ArgumentNullException: 'Value cannot be null.'
但是,当我在执行以下操作之前继续枚举 DBSet 时,它会起作用Except
:
List<B> bs = bcontext.Set<B>().ToList();
List<P> ps = pcontext.Set<P>().ToList();
List<P> inserts = ps.Except(bs.Select(b => b.ToType())).Take(500).ToList();
两种方式都编译得很好,但我得到了第一种方式的异常,而不是第二种方式。您可以在列表中不存在的 IQueryable 表达式树中放入的内容是否存在一些限制?
解决方案
通常 IQueryable 用于避免执行查询,直到它缩小到我们将获得实际所需数据的确切点。
与 List 相比,当我们执行 .ToList() 时,查询被执行,我们将所有结果保存在内存中,您可以从中查询或过滤掉结果。
根据客户端的性能或网络正确选项可以选择。执行 .ToList 将在内存中为您提供可以执行操作的结果。
对于参考,我会将您重定向到这个答案: IQueryable、List、IEnumerator 之间的差异?
推荐阅读
- php - PHP:如何使用参数在 Oracle 数据库中插入记录?
- algorithm - 为什么要在寻找替换之前在反向链接中标准化规则?
- javascript - 如何通过 id 将对象与 jquery 合并
- firebase - Firebase auth().onAuthStateChanged 不等到 auth().signInWithCredential 完成
- javascript - 将 Web 应用程序转换为 Lorca 桌面应用程序时出现 404(未找到)错误
- .net - ILogger - 冗余日志级别的资源利用率
- database - CMS、客户端和应用程序
- javascript - 如何使用 addEventListener("click") 更改多个具有相同 id 的 div 的颜色?
- sql - sql 多对多关系中插入行时如何解决死锁问题?
- linux - 转储包含共享内存的核心文件,包含在 docker 中的运行进程中