我有一个表单根据他们选择的内容过滤数据.
我试图将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上显示的内容.
有人能告诉我我做错了什么吗?
谢谢 !
这里发生的事情是您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子句的组合,并且应该只生成您要查找的项目.
你可以使用linq Concat:
qry = qry.Concat(
from logs in model.Logs
where logs.CorporationId == corpid
select logs);
Run Code Online (Sandbox Code Playgroud)
另一方面,您可能希望根据条件创建查询,这将选择适当的结果,因此您将查询数据源一次.
| 归档时间: |
|
| 查看次数: |
4809 次 |
| 最近记录: |