我写了这个查询,但结果是错误的
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
此查询中是否存在语法错误或错误?
答案 0 :(得分:2)
由于boolean
表达,您必须对?:
进行分组!参见:
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)
并最终返回单个结果!
ALSO 您可以使用单独的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;
答案 1 :(得分:2)
试试这个:
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 :(得分:1)
也许是因为?运算符不在()和你正在测试arabicSymbol?
尝试:(为了清晰起见,添加额外的行)
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;
答案 3 :(得分:1)
上述两个答案都是正确的,因为它们与操作员的优先级有关(http://msdn.microsoft.com/en-us/library/aa691323(v = vs.71).aspx)
&&在?:之前进行评估。因此,您有效地看到所有&&&s;被应用于?:表达式的else部分。