asp.net c#:Where子句在LINQ中被OR条件绕过

时间:2013-03-13 12:32:35

标签: asp.net linq drop-down-menu conditional-operator

数据库:数据库中有三个表,其中ID为int,代码为string datatype。特殊的(countryId也是字符串)。

  • 国家/地区(countryId,countryCode ...)
  • 公司(companyId,countryId,year,companyCode ...)
  • 中心(centerId,companyId,year,centerCode ...)

我正在尝试获得属于两个不同国家的两个特定中心,我知道中心代码

用户操作:用户从国家/地区 DropDownList中选择一个选项(特殊),这是一个额外的身份添加到ListItem其中给出了随机值(即CORP)。

_DropDownListCountry.Items.Insert(1, new ListItem("Special", "CORP"));

预期当用户从_DropDownListCountry为特定选择上述选项时,应在另一个DropDownList(_DropDownListCenter)中填充两个项目。该项目应该是(例如1111和2222)在列表上。 年度中心公司有关系。

问题:结果显示为(1111,2222,2222),因为数据库中有两个中心,但不同。当我在||查询中使用LINQ时会发生这种情况。但我不明白(代码明智)为什么会发生这种情况。任何帮助将非常感激。

代码

public static IEnumerable<Center> RetriveCenterssByYear(short year)
    {
        List<Center> centers;
        using (var context = new crEntities())
        {
            centers = (from pc in context.Centers
                             join company in context.Companies on pc.CompanyID equals company.CompanyID
                             join co in context.Countries on company.CountryID equals co.CountryID
                             where pc.Year == year 
                                     && pc.CompanyID == company.CompanyID 
                                    && company.CountryID.Equals(co.CountryID)
                                    &&  pc.centerCode.Contains("1111")
                                    ||  pc.centerCode.Contains("2222")

                             select pc).ToList();

        }
        return centers;

    }

1 个答案:

答案 0 :(得分:1)

周围添加一些括号
pc.centerCode.Contains("1111")
||  pc.centerCode.Contains("2222")

所以你的情况应该是

pc.Year == year 
&& pc.CompanyID == company.CompanyID 
&& company.CountryID.Equals(co.CountryID)
&&  (pc.centerCode.Contains("1111")
||  pc.centerCode.Contains("2222"))

由于逻辑运算符具有相同的优先级,因此您的查询当前被解释为

(pc.Year == year 
&& pc.CompanyID == company.CompanyID 
&& company.CountryID.Equals(co.CountryID)
&&  pc.centerCode.Contains("1111"))
||  pc.centerCode.Contains("2222")