неверный результат запроса linq c#

#c# #linq-to-sql

#c# #linq-to-sql

Вопрос:

Я пишу этот запрос, но результат от него неверный

 var query = from item in db.Advances
            where CurrentConfiguration.currentLanguage == GeneralDefinitions.arabicSymbol 
                  ? item.eUser.name.ToLower().Contains(strSearchKey)
                  : item.eUser.englishName.ToLower().Contains(strSearchKey)
            amp;amp; !item.isPaid 
            amp;amp; item.expectedPaymentMonth == dExpectedPayment.Month 
            amp;amp; item.expectedPaymentYear == dExpectedPayment.Year
            amp;amp; item.advanceTypeId == (int)enumAdvanceType.AtOnce
            select item;
  

Ошибка в

 item.expectedPaymentMonth == dExpectedPayment.Month 
amp;amp; item.expectedPaymentYear == dExpectedPayment.Year
  

Это всегда true , хотя item.expectedPaymentMonth != dExpectedPayment.Month
Есть ли какая-либо синтаксическая ошибка или что-то не так в этом запросе?

Комментарии:

1. Вы получите тот же результат amp;amp; , если замените отдельные where предложения на with?

2. @Enigmativity он работает идеально, вы можете отредактировать его и поместить в качестве ответа, чтобы пометить его как правильный ответ, спасибо

3. все ответы решают проблему, спасибо всем

Ответ №1:

Попробуйте это:

 var query =
    from item in db.Advances
    where (CurrentConfiguration.currentLanguage
            == GeneralDefinitions.arabicSymbol
            ? item.eUser.name
            : item.eUser.englishName).ToLower().Contains(strSearchKey)
    where !item.isPaid
    where item.expectedPaymentMonth == dExpectedPayment.Month
    where item.expectedPaymentYear == dExpectedPayment.Year
    where item.advanceTypeId == (int)enumAdvanceType.AtOnce
    select item;
  

Я подозреваю, что троичный оператор вызывает у вас горе.

Ответ №2:

Вы должны сгруппировать boolean s из-за ?: выражения! Смотрите:

 var query = from item in db.Advances
            where 
            (
                CurrentConfiguration.currentLanguage == GeneralDefinitions.arabicSymbol 
                ? item.eUser.name.ToLower().Contains(strSearchKey)
                : item.eUser.englishName.ToLower().Contains(strSearchKey)
            )
            amp;amp; !item.isPaid 
            amp;amp; item.expectedPaymentMonth == dExpectedPayment.Month 
            amp;amp; item.expectedPaymentYear == dExpectedPayment.Year
            amp;amp; item.advanceTypeId == (int)enumAdvanceType.AtOnce
            select item;
  

Если вы не используете () , все выражения после item.eUser.englishName.ToLower().Contains(strSearchKey) будут AND с item.eUser.englishName.ToLower().Contains(strSearchKey) и, наконец, вернут один результат!
ТАКЖЕ вы можете использовать отдельные предложения where:

 var query = from item in db.Advances
            where 
                CurrentConfiguration.currentLanguage == GeneralDefinitions.arabicSymbol 
                ? item.eUser.name.ToLower().Contains(strSearchKey)
                : item.eUser.englishName.ToLower().Contains(strSearchKey)
            where !item.isPaid 
                amp;amp; item.expectedPaymentMonth == dExpectedPayment.Month 
                amp;amp; item.expectedPaymentYear == dExpectedPayment.Year
                amp;amp; item.advanceTypeId == (int)enumAdvanceType.AtOnce
            select item;
  

Ответ №3:

Возможно, потому что? оператор не находится между (), и вы тестируете arabicSymbol ?

попробуйте: (дополнительные строки добавлены для ясности)

 where

(

CurrentConfiguration.currentLanguage == GeneralDefinitions.arabicSymbol ? item.eUser.name.ToLower  ().Contains(strSearchKey) : item.eUser.englishName.ToLower().Contains(strSearchKey) 

)
                    amp;amp; !item.isPaid amp;amp; item.expectedPaymentMonth == dExpectedPayment.Month amp;amp; item.expectedPaymentYear == dExpectedPayment.Year 
                    amp;amp; item.advanceTypeId == (int)enumAdvanceType.AtOnce 
                    select item; 
  

Ответ №4:

Оба приведенных выше ответа верны, поскольку они относятся к предустановке оператора (http://msdn.microsoft.com/en-us/library/aa691323 (v= против 71).aspx)

amp;amp; вычисляется перед ?: . Таким образом, вы фактически видите, что все amp;amp; применяются к части else выражения ?: .