2013-11-25 4 views
0

Я просмотрел много сообщений, и я до сих пор не могу достичь желаемого результата.linq2sql IQueryable Predicate, не может фильтровать записи таблицы SQL

У меня есть страница aspx с 3 списками и кнопка поиска. Когда пользователь нажимает кнопку поиска, я хочу построить запрос linq, который будет возвращать результат только фильтрам, выбранным в comboboxes, и привязывать их к 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

Ну, что происходит с кодом вы представили? И почему вы вызываете 'AsQueryable()', когда 'db.TransactionLogs' должен быть совместим с' IQueryable 'уже? –

+0

причина добавления .AsQueryable() заключается в том, что я могу использовать дерево выражений, стандартный запрос IEnumerable не IQueryable. – user2343291

+0

Этого действительно не должно быть. Если это так, значит, вся ваша фильтрация будет выполняться на стороне клиента. Если вы используете «DataContext», я бы ожидал «Table ». –

ответ

0

Thank You 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

Смежные вопросы