2013-11-25 71 views
0

我已經搜索了很多帖子,我仍然無法實現我想要的結果。linq2sql IQueryable謂詞不能過濾SQL表記錄

我有一個帶有3個組合框的aspx頁面和一個搜索按鈕。 當用戶點擊搜索按鈕時,我想構建一個linq查詢,它只會返回組合框中選定的過濾器的結果並將其綁定到一個gridview。

組合框是帳戶,網站和交易,我正在通過日誌進行搜索,並且只想返回所選組合框,如果未從組合框中進行選擇,則忽略查詢的添加。

在點擊按鈕

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()的原因是我可以使用表達式樹,標準查詢是IEnumerable而不是IQueryable。 – 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