编程语言
首页 > 编程语言> > 首页> C#>动态Linq的where子句抛出OutOfMemoryException

首页> C#>动态Linq的where子句抛出OutOfMemoryException

作者:互联网

我是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()
}

标签:dynamic-linq,linq,c,entity-framework,expression-trees
来源: https://codeday.me/bug/20191112/2023681.html