2016-08-10 7 views
4

데이터 목록을 전달할 클래스가 있습니다. 제가IQueryable을 매개 변수로 전달

  1. 창에
  2. 필터 I 매개 변수로 가지며, 제 열거 된 목록으로 필터링 된 결과를 표시하는 조건으로 데이터 전체 데이터 세트의 공급 업체의 목록이 클래스를 원한다.

내가 달성하고 싶은 의사 코드로 IQueryable 조건을 추가했습니다. 이것이 가능한가?

internal class Problem 
{ 
    public IEnumerable<Vendor> Vendors { get; set; } 
    public IEnumerable<Class1> ReturnedData { get; set; } 

    public Problem(List<Class1> data, IQueryable condition) 
    { 
     Vendors = data.SelectMany(d => d.Vendors).Select(v => v.VendorName).Distinct().Select(v => new Vendor {VendorName = v}).ToList(); 

     ReturnedData = data.AsQueryable().Where(condition); 
    } 
} 

internal class Class1 
{ 
    public IEnumerable<Vendor> Vendors { get; set; } 
    // lots of other stuff 
} 

internal class Vendor 
{ 
    public object VendorName { get; set; } 
} 

답변

2

확장 방법으로 IQuerable<T>.Where()를 호출 걸리는 매개 변수는 IQueryable 인스턴스가 아닌, 오히려 조건식 : 인스턴스화 할 때 이제 다양한 필터를 만들 수 있습니다

public Problem(List<Class1> data, Expression<Func<Class1, bool>> condition) 
{ 
    Vendors = data.SelectMany(d => d.Vendors).Select(v => v.VendorName).Distinct() 
        .Select(v => new Vendor {VendorName = v}).ToList(); 

    ReturnedData = data.AsQueryable().Where(condition); 
} 

Problem 클래스 :

var problemInstance = new Problem(data, x => x.VendorName == "Rob"); 
+0

매개 변수로 IQueryable을 사용합니다. 두 x 째 매개 변수는 술어입니다. – sturcotte06

+0

@ sturcotte06, 기술적으로는 올바르지 만 IQueryable의 확장 메서드이기 때문입니다. 이것은 거의 직접적으로 그리고 거의 항상 확장 방법으로 호출되는 경우는 거의 없으며, 이는 OP가 호출하는 방법과 정확히 같습니다. 결과적으로 올바른 오버로드가 예상하는 매개 변수는 술어가되며 IQueryable을 전달하는 유일한 시간은 직접 호출 할 때입니다. –

3

약간 씩 다를 수 있습니다. 그 후 먼저 설치 nuget 패키지 System.Linq.Dynamic

Install-Package System.Linq.Dynamic 

, `함수는 매개 변수로 문자열을 지원하게 된 IQueryable의. 내가 입력 매개 변수로 단지 대리자를 사용하여 선호 Func<Class1, bool>>

2

을 만들지 않고

protected static IQueryable<T> ApplyGridFilter<T>(IQueryable<T> query) 
{ 
      var qText = "id == 1"; 

      query = query.Where(qText); 
      return query; 
} 

이점은 당신이 다음 쉽게 클라이언트 측에서 WHERE 조건을 구축 할 수 있다는 것입니다 필터 로직을 구현 : 그래서 당신은이 작업을 수행 할 수 있습니다 호출 클래스에서

class Problem{ 
     public Problem(data, Func<data, IEnumerable<Class1>> delegate){ 
       ReturnedData = delegate(data); 
     } 
    } 

var problem = new Problem(data, ds => ds.where(d => d.name =="xyz").tolist());