неверный результат из запроса linq c # - PullRequest
0 голосов
/ 22 октября 2011

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

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

Неправильно в

item.expectedPaymentMonth == dExpectedPayment.Month 
&& item.expectedPaymentYear == dExpectedPayment.Year

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

Ответы [ 4 ]

2 голосов
/ 22 октября 2011

Вы должны сгруппировать 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)
            )
            && !item.isPaid 
            && item.expectedPaymentMonth == dExpectedPayment.Month 
            && item.expectedPaymentYear == dExpectedPayment.Year
            && 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 
                && item.expectedPaymentMonth == dExpectedPayment.Month 
                && item.expectedPaymentYear == dExpectedPayment.Year
                && item.advanceTypeId == (int)enumAdvanceType.AtOnce
            select item;
2 голосов
/ 22 октября 2011

Попробуйте:

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;

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

1 голос
/ 22 октября 2011

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

. && оценивается перед?:. Следовательно, вы фактически видите, что все && применяются к части else выражения?:.

1 голос
/ 22 октября 2011

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

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

where

(

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

)
                    && !item.isPaid && item.expectedPaymentMonth == dExpectedPayment.Month && item.expectedPaymentYear == dExpectedPayment.Year 
                    && item.advanceTypeId == (int)enumAdvanceType.AtOnce 
                    select item; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...