2

当我运行此代码时,我会在添加新记录之前检查是否存在与银行帐号、增值税号或 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());
4

2 回答 2

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())
 );
于 2013-06-19T12:42:22.010 回答
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 执行计划并避免参数嗅探问题(即过滤器),并且还避免像这样where @x is NULL or @x = table.field的谓词 lambda 中的映射问题。

于 2013-06-19T12:44:21.637 回答