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

时间:2013-06-19 12:39:25

标签: c# linq linq-to-entities

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

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

我需要做的只是在文本存在的情况下尝试将textbox.text与db字段匹配!

我可以在存储过程中执行此操作,没有任何问题,但我仍在学习这个LINQ的东西。有人可以帮忙吗?

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

2 个答案:

答案 0 :(得分:2)

这可能会成功

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

答案 1 :(得分: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个过滤器,并且还可以避免像this这样的谓词lambdas中的映射问题。