linq查询错误的结果c#

时间:2011-10-22 11:24:08

标签: 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)
            && !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 个答案:

答案 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)之后的所有表达式都将ANDitem.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部分。