我有一个表单根据他们选择的内容过滤数据。
我正在尝试将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上显示的内容。
有人能告诉我我做错了吗?
谢谢!
答案 0 :(得分:9)
这里发生的是您每次都从源数据中重新定义qry
。 qry
与IEnumerable<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;
} }