LINQ查询中的In操作符

本文关键字:In 操作符 查询 LINQ | 更新日期: 2023-09-27 18:03:51

下拉菜单中有几个选项,即

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;
            }
        }

现在,当我尝试这一行//列表admin = tea.spadminlist().ToList();然后数据源显示为空其中sp返回值为ie。工厂

所以我决定写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子句结束

,我也想如果角色不是admin,那么我不想显示工厂值,如果角色是admin,那么只有我想在下拉框中显示值"工厂"所以我如何在第二个linq查询中使用not in操作符,而在第一个linq中使用for in操作符,但这显示了一个错误,正如我上面提到的

LINQ查询中的In操作符

您的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)——这样做更清晰