Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net c#:在LINQ中,Where子句被OR条件绕过_Asp.net_Linq_Drop Down Menu_Conditional Operator - Fatal编程技术网

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

asp.net c#:在LINQ中,Where子句被OR条件绕过,asp.net,linq,drop-down-menu,conditional-operator,Asp.net,Linq,Drop Down Menu,Conditional Operator,数据库:数据库中有三个表,其中ID为int,代码为字符串数据类型。异常(countryId也是字符串) 国家(国家ID、国家代码…) 公司(公司ID、国家ID、年份、公司代码…) 中心(中心ID、公司ID、年份、中心代码…) 我试图获得两个特定的中心,它们属于两个不同的国家,我知道中心的代码 用户操作:用户从国家/地区下拉列表中选择一个选项(特殊),该选项是添加到列表项中的一个额外标识,其中给出了一个随机值(即CORP) _DropDownListCountry.Items.Insert(1

数据库:数据库中有三个表,其中ID为int,代码为
字符串
数据类型
。异常(countryId也是字符串)

  • 国家(国家ID、国家代码…)
  • 公司(公司ID、国家ID、年份、公司代码…)
  • 中心(中心ID、公司ID、年份、中心代码…)
我试图获得两个特定的中心,它们属于两个不同的国家,我知道中心的代码

用户操作:用户从国家/地区
下拉列表
中选择一个选项(特殊),该选项是添加到
列表项
中的一个额外标识,其中给出了一个随机值(即CORP)

_DropDownListCountry.Items.Insert(1, new ListItem("Special", "CORP"));
预期当用户从特定年份的_DropDownListCountry中选择上述选项时,则应在另一个
DropDownList
(_DropDownListCenter)中填充两个项目。该项目应在列表中(例如1111和2222)。在之前,与中心公司存在关系

问题:结果显示为(1111222222),因为数据库中有两个中心,但年份不同。当我在
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;

    }
公共静态IEnumerable RetrieveCenter按年(短年)
{
名单中心;
使用(var context=new crenties())
{
中心=(从上下文中的pc。中心
在上下文中加入公司。pc上的公司。CompanyID等于company.CompanyID
在上下文中加入co。company.CountryID上的国家等于co.CountryID
其中pc.Year==年
&&pc.CompanyID==company.CompanyID
&&company.CountryID.Equals(co.CountryID)
&&pc.centerCode.包含(“1111”)
||pc.centerCode.包含(“2222”)
选择pc.ToList();
}
返回中心;
}

在周围添加一些括号

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")

where子句后面的括号起了神奇的作用。其中(pc.year==年份…)。非常感谢Sergey Kudriavtsev。