如何将LINQ查询相互追加?

时间:2013-08-09 14:30:58

标签: 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;


  }
}

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

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

谢谢!

4 个答案:

答案 0 :(得分:9)

这里发生的是您每次都从源数据中重新定义qryqryIEnumerable<T>的{​​{1}}相同,因此您应该可以像这样更换代码:

logs

在此设置结束时, var qry = model.Logs; if( // Condition ) qry = qry.Where(x => x.CorporationId == corpId); if( // Another condition) qry = qry.Where(x => x.IsException); 将是所有选定qry子句的组合,并且应该只生成您要查找的项目。

答案 1 :(得分:6)

您可以使用linq Concat

qry = qry.Concat(
            from logs in model.Logs
            where logs.CorporationId == corpid
            select logs);

另一方面,您可能希望根据条件创建查询,从而选择合适的结果,这样您就可以查询一次数据源。

答案 2 :(得分:0)

我可以推荐在LinqKit中使用Predicate Builder功能。您可以使用And和Or方法附加其他搜索参数。

我将它用于此目的并且工作得非常好。

答案 3 :(得分:0)

尝试使用Concat:

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

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

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

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

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

dataGridView1.DataSource = qry;

} }