2013-10-17 4 views
-1

Id, Title, ISBN, Tag 속성을 가진 책 엔티티가있는 경우. 내부 winform 윈도우 사용자는 검색 텍스트를 입력 할 수 있으며 combobox에서 ByTitle, ByISBN, ByTag 검색 옵션을 선택할 수 있습니다.동적 linq 쿼리

는 버튼 클릭 이벤트에 해당 값은

var comboSelection = (comboBox1.SelectedItem ?? "").ToString(); 
var searchText = txtSearchText.Text; 

지금은이 값을 사용하여 내 저장소에서 값을 잡아하려는

로 가져옵니다. 난 이미 repository.GetBooks() IEnumerable 책을 반환합니다.

제 질문은 콤보 선택을 염두에두고 where 절을 사용하여 쿼리를 정의하는 방법입니다.

var result = repository.GetBooks().Where(x=>x. ....) 

분명히 ByTag은 .Where(x=>x.Tag==comboSelection)

+0

세 가지 유스 케이스 만있는 경우이 동적 작업을 수행하려고하지는 않습니다. 그냥 if-else 플로우를 수행하십시오. –

답변

2

같은 몇 가지 일을 작성할 수 있습니다. ,

  • Reflection를 사용하지만 당신의 ComboBox itemsProperty name 대응과 관련이 있어야합니다

    //Use this Dictionary to get the corresponding delegate for the Where method 
    //Suppose your GetBooks() returns a collection of Book elements 
    Dictionary<Func<Book,bool>> predicates = new Dictionary<Func<Book,bool>>(); 
    predicates.Add("ByTitle", b=>b.Title.Contains(searchText)); 
    predicates.Add("ByISBN", b=>b.ISBN.Contains(searchText)); 
    predicates.Add("ByTag", b=>b.Tag.Contains(searchText)); 
    
    if(comboSelection != ""){ 
        var result = repository.GetBooks().Where(predicates[comboSelection]); 
        //... other code 
    } 
    

    참고 : 다른 접근 방법은 다음과 같은 작업을 수행해야합니다.

  • Dynamic LINQ을 사용하면 더 많은 정보를 검색해야합니다.
1

당신은 동적 Linq에 라이브러리를 사용할 수 있어야한다이 쿼리보다 선택합니다. ByTitle, ByISBN, ByTag : 그 후 당신은 내가 당신의 ComboBox가 이러한 항목 추측이

repository.GetBooks().Where("Tag == @0", comboSelection); 
+0

태그 나 다른 콤보 상자 대신 ISBN이 될 수 있습니다. – user2783193

+0

사용자가 선택한 것을 기반으로 전체 문자열을 동적으로 만들 수 있습니다 – Anand