#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 выражения ?: .