2013-06-19 3 views
2

Когда я запускаю этот код, я проверяю, что перед тем, как добавить новую запись, уже нет уже существующей, которая соответствует номеру банковского счета, номеру НДС или адрес электронной почты Paypal ...Игнорирование пустых строк при поиске с LINQ-to-Entities

Но, если текстовые поля пусты, это соответствует первой записи, в которой есть пустое поле в базе данных. например. Если 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()); 

ответ

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()) 
); 
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, а также позволяет избежать проблем с отображением в предикатных лямбдах, например this.

+0

Большое спасибо Stuart - ваше предложение отлично работает! Другое сообщение предложило решение, которое немного меньше кода, но я очень благодарю вас за помощь - это искренне ценится! – wotney

Смежные вопросы