【问题标题】:Ignoring Empty strings when searching with LINQ-to-Entities使用 LINQ-to-Entities 搜索时忽略空字符串
【发布时间】:2013-06-19 12:39:25
【问题描述】:

当我运行此代码时,我会在添加新记录之前检查是否存在与银行帐号、增值税号或 Paypal 电子邮件地址匹配的现有记录...

但是,如果文本框为空,则它匹配数据库中具有空字段的第一条记录。 例如。如果 txtBankAcctNum.text = "" 匹配 db 中没有银行帐号的第一条记录。

如果存在文本,我需要它做的只是尝试将 textbox.text 与 db 字段匹配!

我可以在存储过程中执行此操作,没有问题,但我仍在学习这些 LINQ 内容。有人可以帮忙吗?

billingDetail = db.BillingDetails.FirstOrDefault(bd => bd.BankAcctNum == txtBankAcctNum.Text.Trim() 
                || bd.PayPalEmailAddress == txtPayPalEmailAddress.Text.Trim()
                || bd.VATnum == txtVATnum.Text.Trim());

【问题讨论】:

    标签: c# linq linq-to-entities


    【解决方案1】:

    这可能会成功

    bool bankAcctNumIsValid = !string.IsNullOrWhiteSpace(txtBankAcctNum.Text.Trim());
    bool payPalEmailAddressIsValid = !string.IsNullOrWhiteSpace(txtPayPalEmailAddress.Text.Trim());
    bool vatNumIsValid = !string.IsNullOrWhiteSpace(txtVATnum.Text.Trim());
    
    billingDetail = db.BillingDetails
     .FirstOrDefault(bd => 
        (bankAcctNumIsValid && bd.BankAcctNum == txtBankAcctNum.Text.Trim()) || 
        (payPalEmailAddressIsValid && bd.PayPalEmailAddress == txtPayPalEmailAddress.Text.Trim()) ||
        (vatNumIsValid && bd.VATnum == txtVATnum.Text.Trim())
     );
    

    【讨论】:

      【解决方案2】:

      您可以在具体化之前有条件地构建表达式树,如下所示:

      var billingDetailQuery = db.BillingDetails.Where(bd => true);
      
      if (!String.IsNullOrEmpty(txtBankAcctNum.Text))
      {
        billingDetailQuery = billingDetailQuery
                 .Where(bd => bd.BankAcctNum == txtBankAcctNum.Text.Trim());
      }
      // Same for Email and VAT
      
      var result = billingDetailQuery.FirstOrDefault();
      

      这种方法通常会导致更集中的 SQL 执行计划并避免 parameter sniffing issueswhere @x is NULL or @x = table.field 过滤器,并且还避免了谓词 lambda 中的映射问题,例如 this

      【讨论】:

      • 非常感谢斯图尔特 - 你的建议很有效!另一篇文章提供了一个代码更少的解决方案,但我非常感谢你的帮助 - 真的很感激!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 2012-11-10
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      相关资源
      最近更新 更多