首页> C#>动态Linq的where子句抛出OutOfMemoryException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了首页> C#>动态Linq的where子句抛出OutOfMemoryException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2203字,纯文字阅读大概需要4分钟。
内容图文
![首页> C#>动态Linq的where子句抛出OutOfMemoryException](/upload/InfoBanner/zyjiaocheng/666/382828d3f7244feb9d445d42980e4948.jpg)
我是Linq的新手,并且是使用表达式树的真正初学者.
我有一个通用的表达式例程,可构建一个简单的Linq where子句,该子句在以下位置找到:
https://www.simple-talk.com/dotnet/net-framework/dynamic-linq-queries-with-expression-trees/
public Func<TSource,bool> SimpleFilter<TSource> (string property, object value)
{
var type = typeof(TSource);
var pe = Expression.Parameter(type, "p");
var propertyReference = Expression.Property(pe,property);
var constantReference = Expression.Constant(value);
var ret = Expression.Lambda<Func<TSource, bool>>
(Expression.Equal(propertyReference, constantReference), new[] { pe });
return ret.Compile();
}
当我将函数调用为SimpleFilter(“ JobCustomerID”,449152)时,
产生(p => p.JobCustomerId == 449152)是正确的.
如果我在Linq语句中手动放置该条件,则会得到正确的回报.
var jj = db.VW_Job_List.Where((p => p.JobCustomerId == 449152));
但是,通过过滤器函数调用时,Linq会引发OutOfMemoryException.
在我的应用程序中将其称为:
var jj = db.VW_Job_List.Where(SimpleFilter<VW_Job_List>("JobCustomerID", 449152));
如果我使用文本条件调用该函数,它将正确返回:
var jj = db.VW_Job_List.Where(SimpleFilter<VW_Job_List>("CompanyCode", "LCS"));
关于使用需要容纳的整数变量是否有特定的规定?我的密码编码不正确吗?任何想法或见解将不胜感激.
解决方法:
两个电话
var jj = db.VW_Job_List.Where((p => p.JobCustomerId == 449152));
和
var jj = db.VW_Job_List.Where(SimpleFilter<VW_Job_List>("JobCustomerID", 449152));
不相等.第一个解析为Queryable.Where,因此将筛选器应用于数据库内部,第二个解析为Enumerable.Where,从而导致将整个表加载到内存中并在其中应用筛选器.
问题在于您的SimpleFilter的返回类型为Func< TSource,bool>.为了使它们等效,它应该是Expression< Func< TSource,bool>.注意,尽管它们在外观上看起来相同,但是由于当应用于IQueryable< T>时重载分辨率不同,因此lambda表达式与lambda委托之间存在巨大差异.
因此,更改这种方法,然后重试:
public Expression<Func<TSource,bool>> SimpleFilter<TSource> (string property, object value)
{
var type = typeof(TSource);
var pe = Expression.Parameter(type, "p");
var propertyReference = Expression.Property(pe,property);
var constantReference = Expression.Constant(value);
var ret = Expression.Lambda<Func<TSource, bool>>
(Expression.Equal(propertyReference, constantReference), new[] { pe });
return ret; // No .Compile()
}
内容总结
以上是互联网集市为您收集整理的首页> C#>动态Linq的where子句抛出OutOfMemoryException全部内容,希望文章能够帮你解决首页> C#>动态Linq的where子句抛出OutOfMemoryException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。