在使用LINQ-to-Entities进行搜索时忽略空字符串

本文关键字:字符串 搜索 LINQ-to-Entities | 更新日期: 2023-09-27 18:19:06

当我运行此代码时,我正在检查,在我添加新记录之前,已经没有一个与银行账号,增值税号码或Paypal电子邮件地址相匹配的现有记录…

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

我需要它做的只是尝试匹配文本框。如果存在文本,则将文本写入db字段!

我可以在存储过程中做到这一点,没有问题,但我仍然在学习LINQ的东西。有人能帮忙吗?

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

在使用LINQ-to-Entities进行搜索时忽略空字符串

这可能会成功

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

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

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执行计划,避免了参数嗅探问题,如where @x is NULL or @x = table.field过滤器,还避免了谓词lambda中的映射问题,如