2013-11-25 3 views
0

많은 게시물을 검색했는데 원하는 결과를 얻을 수 없습니다.linq2sql IQueryable Predicate는 SQL 테이블 레코드를 필터링 할 수 없습니다.

3 개의 콤보 박스가있는 aspx 페이지와 검색 버튼이 있습니다. 사용자가 검색 버튼을 클릭하면 콤보 상자에서 선택된 필터의 결과 만 반환하고 gridview에 바인딩하는 linq 쿼리를 작성하려고합니다.

콤보 박스는 계정, 사이트 및 트랜잭션입니다. 로그를 통해 검색 중이며 선택 항목이 콤보 박스에서 선택되지 않은 경우 선택한 콤보 상자 만 반환하려는 경우 쿼리에 대한 추가가 무시됩니다. 버튼 클릭에

protected void btnSearch_Click(object sender, EventArgs e) 
    { 
     // This is the Linq definition 
     List<Expression<Func<Logs, bool>>> predicates = new List<Expression<Func<Logs, bool>>>(); 

     if (Convert.ToInt32(cboAccount.SelectedValue) != -1) 
     { 
      var accountID = Convert.ToInt32(cboAccount.SelectedValue); 
      predicates.Add(p => p.accountID == accountID); 
     } 

     if (Convert.ToInt32(cboSite.SelectedValue) != -1) 
     { 
      var siteID = Convert.ToInt32(cboSite.SelectedValue); 
      predicates.Add(p => p.siteID == siteID); 
     } 

     if (Convert.ToInt32(cboTransactionType.SelectedValue) != -1) 
     { 
      var transID = Convert.ToInt32(cboTransactionType.SelectedValue); 
      predicates.Add(p => p.transactionID == transID); 
     } 

     rgLog.DataSource = Logs.LoadLogs(predicates); 
    } 

방법 내 로그 내부 클래스

public class Logs 
{ 

    private int AccountID; 
    private int SiteID; 
    private string SerialNumber; 
    private int UserID; 
    private int TransActionMessageID; 

    public int accountID 
    { 
     get { return AccountID; } 
     set { AccountID = value; } 
    } 

    public int siteID 
    { 
     get { return SiteID; } 
     set { SiteID = value; } 
    } 

    public string serialNumber 
    { 
     get { return SerialNumber; } 
     set { SerialNumber = value; } 
    } 

    public int userID 
    { 
     get { return UserID; } 
     set { UserID = value; } 
    } 

    public int transactionMessageID 
    { 
     get { return TransActionMessageID; } 
     set { UserID = value; } 
    } 


    public static IQueryable<TransactionLog> LoadLogs(List<Expression<Func<TransactionLog, bool>>> predicates) 
    { 
     iThNkContextDataContext db = new iThNkContextDataContext(); 
     var LogList = db.TransactionLogs.AsQueryable(); 

     foreach (Expression<Func<TransactionLog, bool>> pred in predicates) 
     { 
      LogList = LogList.Where(pred); 
     } 

     List<TransactionLog> result = LogList.ToList(); 

     return result; 
    } 

내가 잘못 가 사전에 감사하고 무엇 메신저 모른다.

+1

을 다음과 같이

내 코드는 지금 보면? 그리고'db.TransactionLogs'가'IQueryable '과 호환되어야 할 때 왜 AsQueryable()을 호출할까요? –

+0

.AsQueryable() 추가 이유는 식 트리를 사용할 수 있으므로 표준 쿼리는 IQueryable이 아닌 IEnumerable입니다. – user2343291

+0

정말 그렇게해서는 안됩니다. 그렇다면 모든 필터링이 클라이언트 측에서 수행 될 것임을 의미합니다. 'DataContext'를 사용한다면'Table '를 기대할 수 있습니다. –

답변

0

고맙습니다 Jon Skeet.

테이블과 클래스가 혼동 스러웠습니다. 당신이 제시 한 코드를 발생하는 음

List<Expression<Func<TransactionLog, bool>>> predicates = new List<Expression<Func<TransactionLog, bool>>>(); 
     iThNkContextDataContext db = new iThNkContextDataContext(); 

     if (Convert.ToInt32(cboAccount.SelectedValue) != -1) 
     { 
      predicates.Add(p => p.AccountID == Convert.ToInt32(cboAccount.SelectedValue)); 
     } 

     if (Convert.ToInt32(cboSite.SelectedValue) != -1) 
     { 
      predicates.Add(p => p.SiteID == Convert.ToInt32(cboSite.SelectedValue)); 
     } 

     if (Convert.ToInt32(cboMessage.SelectedValue) != -1) 
     { 
      predicates.Add(p => p.TransactionMessageID == Convert.ToInt32(cboMessage.SelectedValue)); 
     } 

     var result = db.TransactionLogs.AsQueryable(); 

     foreach (Expression<Func<TransactionLog, bool>> pred in predicates) 
     { 
      result = result.Where(pred); 
     } 

     rgLog.DataSource = result.ToList(); 
+0

그리고 위의 코드가 현재 작동 중입니다. – user2343291