2

このコードを実行すると、新しいレコードを追加する前に、銀行口座番号、VAT 番号、または 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

次のように、具体化の前に条件付きで式ツリーを構築できます。

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ような述語ラムダのマッピングの問題も回避します。

于 2013-06-19T12:44:21.637 に答える
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 に答える