如何将LINQ查询相互追加?

Ero*_*ocM 5 c# linq

我有一个表单根据他们选择的内容过滤数据.

我试图将linq查询相互追加,以便最终结果是他们在屏幕上选择的内容.

这是我的代码:

private void button_Search_Click(object sender, EventArgs e)
{
  using (var model = new SuburbanPortalEntities())
  {
    var qry = from logs in model.Logs
              select logs;

    Guid corpid;
    if (Guid.TryParse(textBox_CorporationGuid.Text, out corpid))
    {
      qry = from logs in model.Logs
                where logs.CorporationId == corpid
                select logs;
    }

    Guid tokenid;
    if (Guid.TryParse(textBox_TokenId.Text, out tokenid))
    {
      qry = from logs in model.Logs
            where logs.TokenId == tokenid
            orderby logs.LogDateTime descending 
            select logs;
    }

    if (checkBox_DisplayErrors.Checked)
    {
      qry = from logs in model.Logs
            where logs.IsException
            select logs;
    }

    if (checkBox_DisplayWarnings.Checked)
    {
      qry = from logs in model.Logs
            where logs.IsWarning
            select logs;
    }

    dataGridView1.DataSource = qry;


  }
}
Run Code Online (Sandbox Code Playgroud)

我没有运气.最后一次qry in是我的datagridview上显示的内容.

有人能告诉我我做错了什么吗?

谢谢 !

Tej*_*ejs 9

这里发生的事情是您qry每次都要从源数据中重新定义.qry是一个IEnumerable<T>相同的logs,所以你应该能够像这样替换你的代码:

 var qry = model.Logs;

 if( // Condition )
    qry = qry.Where(x => x.CorporationId == corpId);

 if( // Another condition)
    qry = qry.Where(x => x.IsException);
Run Code Online (Sandbox Code Playgroud)

在此设置结束时,qry将是所有选定Where子句的组合,并且应该只生成您要查找的项目.

  • `qry`是一个`IQueryable <T>`,而不是`IEnumerable <T>`.(虽然`IQueryable <T>`继承自`IEnumerable <T>`.)这是一个非常重要的区别. (4认同)

Zbi*_*iew 6

你可以使用linq Concat:

qry = qry.Concat(
            from logs in model.Logs
            where logs.CorporationId == corpid
            select logs);
Run Code Online (Sandbox Code Playgroud)

另一方面,您可能希望根据条件创建查询,这将选择适当的结果,因此您将查询数据源一次.