【问题标题】:In operator in LINQ queryLINQ 查询中的 In 运算符
【发布时间】:2016-08-25 11:19:30
【问题描述】:

下拉列表中有几个项目,即

Apply
Orange
Grapes
Factory

我尝试用两个这样的 linq 查询填充下拉列表

        if (!Page.IsPostBack)
        {

            if (Session["UserName"] == "admin")
            {
                //List<spadminlist_Result> admin = tea.spadminlist().ToList();

                var admin=from ad in tea.tblReg
                          .Where((x=>x.Region).Contains("Factory"))
                          .GroupBy(x=>x.Region)
                          .Select(x=> new {Region=x.Key})
                          .ToList();



                regiondrop.DataSource = admin;
                regiondrop.DataTextField = "Region";
                regiondrop.DataValueField = "Region";
                regiondrop.DataBind();
                Label4.Visible = false;

            }
            else
            {
                var list = tea.tblReg.AsEnumerable()
                   .Where(x => !x.Region.Any(char.IsDigit) && (x.Region != ""))
                   .GroupBy(x => x.Region)
                   .Select(x => new { Region = x.Key, Value = x.Key })
                   .ToList();

                regiondrop.DataSource = list;
                regiondrop.DataTextField = "Region";
                regiondrop.DataValueField = "Region";
                regiondrop.DataBind();
                Label4.Visible = false;
            }

        }

现在当我尝试这条线时 //列表管理员 = tea.spadminlist().ToList(); 然后数据源显示空 其中作为 sp 返回值,即。工厂

所以我决定 qrite linq 查询,所以在编写 linq 查询之后

var admin=from ad in tea.tblReg
                          .Where((x=>x.Region).Contains("Factory"))
                          .GroupBy(x=>x.Region)
                          .Select(x=> new {Region=x.Key})
                          .ToList();

这显示一个错误

错误 3 查询正文必须以 select 子句或 group 子句结尾

如果角色不是管理员,我也不想显示工厂值,如果角色是管理员,那么我只想在下拉列表中显示值“工厂” 所以我如何在第二个 linq 查询中使用 not in 运算符,在第一个 LINQ 中使用 for in 运算符,但这显示了我上面提到的错误

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?
  • 想实现管理员登录时只在下拉列表中显示出厂值,否则所有值都将显示在下拉列表中..
  • 请编辑问题的名称以更好地适应问题 + 如果您可以从下面的问题中删除 cmets - 它们不会为未来的用户添加有用的信息

标签: c# linq notin in-operator


【解决方案1】:

您的Where 的语法错误,您不需要GroupBy

var admin = tea.tblReg.Where(x => x.Region == "Factory")
                      .Select(x => x.Region)
                      .Distinct()
                      .ToList();

这将只从数据库中检索Region 为“工厂”的记录,并以与else 相同的形式创建它


您还可以对代码进行一些重构以减少重复(而且还可以做更多):

if (!Page.IsPostBack)
{
    if (Session["UserName"] == "admin")
    {
        regiondrop.DataSource = tea.tblReg.Where(x => x.Region == "Factory")
                                   .Select(x => x.Region)
                                   .Distinct()
                                   .ToList();
    }
    else
    {
        regiondrop.DataSource = tea.tblReg.Where(x => x.Region.All(char.IsLetter) && 
                                                      x.Region != "" &&
                                                      x.Region != "Factory")
                                          .Select(x => x.Region)
                                          .Distinct()
                                          .ToList();
    }

    regiondrop.DataTextField = "Region";
    regiondrop.DataValueField = "Region";
    regiondrop.DataBind();
    Label4.Visible = false;
}

还请注意,我将 !Any(char.IsDigit) 的用法更改为 All(char.IsLetter) - 这样做的方式更清晰

【讨论】:

  • 这在第一个 linq 查询中显示错误。错误 4“chart_project.tblReg”不包含“Key”的定义,并且没有扩展方法“Key”接受“chart_project”类型的第一个参数。可以找到 tblReg'(您是否缺少 using 指令或程序集引用?)
  • 如果我不想在第二个 linq 查询中使用工厂值怎么办
  • 因为不想工厂我这样做... .Where(x => !x.Region.Any(char.IsDigit) && (x.Region != "") && (x => !exceptionList.Contains("Factory"))) 但这显示错误.. 错误 5 不能在此范围内声明名为“x”的局部变量,因为它会给“x”赋予不同的含义,这已经在表示其他内容的“父或当前”范围
  • @Gilad Green 但 Region 列中也有几个数字,我不希望这就是我放这个的原因!Any(char.IsDigit)
  • @user6628729 - 查看最新编辑。添加该值不是“工厂”,并从该查询中删除了 GroupBy。我强烈建议您研究 lambda 表达式和 linq
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2020-06-06
相关资源
最近更新 更多