gpt4 book ai didi

c# - List 和 IQueryable 之间的执行差异

转载 作者:行者123 更新时间:2023-11-30 15:15:49 24 4
gpt4 key购买 nike

我正在尝试编写一个通用的数据库更新方法,该方法可以利用 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.'

但是,当我像这样在执行 Except 之前继续枚举 DBSet 时,它会起作用:

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<T>.Except 的实现, 检查 here :

public static IQueryable<TSource> Except<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2) {
if (source1 == null)
throw Error.ArgumentNull("source1");
if (source2 == null)
throw Error.ArgumentNull("source2");
return source1.Provider.CreateQuery<TSource>(
Expression.Call(
null,
GetMethodInfo(Queryable.Except, source1, source2),
new Expression[] { source1.Expression, GetSourceExpression(source2) }
));
}

IQueryable<T> 之间的主要区别和 List<T> ,可查询类型在内部使用 Expression<Func<T>> ,因为它是远程执行的,在您使用提供者的情况下,当 List<T>Func<T> 一起工作,因为它是内存处理。当涉及到远程处理时,像 EF 这样的东西会转换为相关的 Sql 查询进行处理,在您的情况下,以下内容会转换为 null在远程处理期间:bs.Select(b => b.ToType()) .

以下是IEnumerable<T>.Except的实现, 检查 here :

public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, 
IEnumerable<TSource> second)
{
if (first == null) throw Error.ArgumentNull("first");
if (second == null) throw Error.ArgumentNull("second");
return ExceptIterator<TSource>(first, second, null);
}

Except本身在内部是一个集合操作,即使对于 List<T>调用 Except(null)将导致相同的异常。

如您所见IQueryable<T>.Except 的定义,了解 Expression and Func 的处理差异很重要, Expression 更多的是关于做什么而 Func 是关于如何做检查 this .

对于一个简单的var intList = new List<int>{1,2,3} ,这就是 Queryable 表达式的样子(如附图所示)。

本质仍然是检查您的提供者在内部将可查询表达式转换成什么,这会导致 null 并因此在处理时出现异常

enter image description here

关于c# - List<T> 和 IQueryable<T> 之间的执行差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51390360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com