如何将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上显示的内容。

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

谢谢 !

这里发生的事情是,您每次都要从源数据中重新定义qryqry是一个IEnumerablelogs ,所以你应该可以像这样替换你的代码:

  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中使用Predicate Builderfunction。 您可以使用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; 

}}