如何将LINQ查询相互附加

本文关键字:查询 LINQ | 更新日期: 2023-09-27 18:26:57

我有一个表单,它根据数据的选择过滤数据。

我试图将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是我的数据网格视图中显示的内容。

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

谢谢!

如何将LINQ查询相互附加

这里发生的事情是,每次都要从源数据中重新定义qryqryIEnumerable<T>,与logs相同,因此您应该能够像这样替换代码:

 var qry = model.Logs;
 if( // Condition )
    qry = qry.Where(x => x.CorporationId == corpId);
 if( // Another condition)
    qry = qry.Where(x => x.IsException);

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

您可以使用linq Concat:

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

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

我可以建议使用LinqKit中的谓词生成器函数。可以使用And和Or方法附加其他搜索参数。

我正是出于这个目的使用它的,而且效果非常好。

尝试使用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;

}}