使用 LINQ-to-Entities 搜索时忽略空字符串
Posted
技术标签:
【中文标题】使用 LINQ-to-Entities 搜索时忽略空字符串【英文标题】:Ignoring Empty strings when searching with 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());
【问题讨论】:
【参考方案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 issues 即 where @x is NULL or @x = table.field
过滤器,并且还避免了谓词 lambda 中的映射问题,例如 this。
【讨论】:
非常感谢斯图尔特 - 你的建议很有效!另一篇文章提供了一个代码更少的解决方案,但我非常感谢你的帮助 - 真的很感激!以上是关于使用 LINQ-to-Entities 搜索时忽略空字符串的主要内容,如果未能解决你的问题,请参考以下文章
Linq-to-Entities:带有 WHERE 子句和投影的 LEFT OUTER JOIN
为啥 LINQ-to-Entities 将此查询放在子选择中?
有没有办法在使用 Azure 认知搜索服务升序排序时忽略空值?