2016-12-07 7 views
3

저는 Linq의 초보자이고 표현식 트리를 가진 진정한 초보자입니다. 동적 Linq where 절이 OutOfMemoryException을 던졌습니다.

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(); 
} 

내가 함수를 호출
https://www.simple-talk.com/dotnet/net-framework/dynamic-linq-queries-with-expression-trees/

(p => p.JobCustomerId == 449152) 그것을 수익률 SimpleFilter("JobCustomerID", 449152)으로 올바른이다 :

이 난에서 발견 절 곳 간단한 Linq에를 구축하는 일반적인 표현 루틴이있다.

Linq 문에 해당 조건을 수동으로 배치하면 올바른 반환 값을 얻을 수 있습니다.

그러나 필터 함수를 통해 호출 될 때 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")); 

거기로 그것은 내 응용 프로그램에서 호출 수용 되었습니까? 내가 잘못 코딩 된 것이 있습니까? 어떤 생각이나 통찰력도 인정 될 것입니다.

+0

그래서 당신이 데이터베이스를 쿼리? 그렇다면 VW_Job_List 테이블에 몇 개의 행이 있습니까? – Evk

답변

3

두 통화

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에 적용되므로 전체 테이블을 메모리에로드하고 필터를 적용합니다.

문제는 SimpleFilterFunc<TSource, bool>입니다. 동등하게 만들려면 Expression<Func<TSource, bool>>이어야합니다. 시각적으로 동일하게 보일지라도, IQueryable<T>에 적용될 때 과부하 해상도가 다르기 때문에 람다 표현식과 람다 델리게이트간에 큰 차이가 있음에 유의하십시오.

그래서,이 같은 방법을 변경하고 다시 시도하십시오

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() 
} 
+0

재미있는 Hummm. 나는 표현식 <...>을 사용하는 것과 EF –

+0

과 함께 사용하지 않는 것의 차이점에 대해서는 절대로 알지 못한다. 이것은 웹 애플리케이션의 성능 저하를 막을 수있다. 고맙습니다. –