c#-List和IQueryable之间的执行差异
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-List和IQueryable之间的执行差异,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2205字,纯文字阅读大概需要4分钟。
内容图文
![c#-List和IQueryable之间的执行差异](/upload/InfoBanner/zyjiaocheng/686/04d7f8b8a32b408fb71a8a2e59b53965.jpg)
我正在尝试编写一种通用的数据库更新方法,该方法可以利用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:’值不能为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>的实现.除检查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>的工作之间的主要区别是:可查询类型在内部与Expression< Func< T>一起使用,因为当List< T>由于Func T在内存中进行处理,因此可以与Func T一起使用.当涉及到远程处理时,像EF之类的东西会转换为相关的Sql查询以进行处理,而在您的情况下,以下内容在远程处理时会转换为null:bs.Select(b => b.T??oType()).
以下是IEnumerable< T>的实现.除了检查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);
}
除了自身内部是设置操作之外,即使对于List< T>也是如此.调用Except(null)将导致相同的异常.
如您所见,IQueryable< T>的定义除了理解理解Expression和Func的处理上的区别很重要外,Expression更多地关于做什么,而Func关于如何检查this.
对于一个简单的var intList = new List {int,int} {1,2,3},这就是Queryable表达式的样子(如附图所示).
实质仍然存在,请检查您的提供程序在内部将Queryable Expression转换为什么,这将导致null并因此导致处理时异常
内容总结
以上是互联网集市为您收集整理的c#-List和IQueryable之间的执行差异全部内容,希望文章能够帮你解决c#-List和IQueryable之间的执行差异所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。