【问题标题】:linq2sql IQueryable Predicate, cannot filter SQL table recordslinq2sql IQueryable Predicate,无法过滤 SQL 表记录
【发布时间】:2013-12-10 05:56:06
【问题描述】:

我已经搜索了很多帖子,但仍然无法达到我想要的结果。

我有一个带有 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;
    }

我不知道我做错了什么 提前谢谢你。

【问题讨论】:

  • 那么您提供的代码会发生什么?还有你为什么打电话给AsQueryable(),而db.TransactionLogs应该已经兼容IQueryable&lt;T&gt;了?
  • 添加 .AsQueryable() 的原因是我可以使用表达式树,标准查询是 IEnumerable 而不是 IQueryable。
  • 真的不应该。如果是,则意味着您的所有过滤都将在客户端执行。如果您使用的是DataContext,我希望您使用Table&lt;TransactionLog&gt;
  • 那么我该如何正确地写这个?
  • 你还没有告诉我们出了什么问题 - 但你真的应该看看你的 iThNkContextDataContext.TransactionLogs 属性返回什么。

标签: c# sql linq iqueryable predicate


【解决方案1】:

谢谢乔恩·斯基特。

我对表格和班级感到困惑。

我的代码现在如下所示

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多