首页 > 解决方案 > 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 表达式树中放入的内容是否存在一些限制?

标签: c#linq

解决方案


通常 IQueryable 用于避免执行查询,直到它缩小到我们将获得实际所需数据的确切点。

与 List 相比,当我们执行 .ToList() 时,查询被执行,我们将所有结果保存在内存中,您可以从中查询或过滤掉结果。

根据客户端的性能或网络正确选项可以选择。执行 .ToList 将在内存中为您提供可以执行操作的结果。

对于参考,我会将您重定向到这个答案: IQueryable、List、IEnumerator 之间的差异?


推荐阅读