Я просмотрел много сообщений, и я до сих пор не могу достичь желаемого результата.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;
}
Я понятия не имею, что им делать неправильно Спасибо заранее.
Ну, что происходит с кодом вы представили? И почему вы вызываете 'AsQueryable()', когда 'db.TransactionLogs' должен быть совместим с' IQueryable 'уже? –
причина добавления .AsQueryable() заключается в том, что я могу использовать дерево выражений, стандартный запрос IEnumerable не IQueryable. – user2343291
Этого действительно не должно быть. Если это так, значит, вся ваша фильтрация будет выполняться на стороне клиента. Если вы используете «DataContext», я бы ожидал «Table». –