在WHERE子句中具有Null值的Linq

已加入
2013年11月5日
留言内容
8
编程经验
Beginner
大家好!

我的桌子上有很多列。我希望能够让用户在每一列上进行搜索。之后,我执行linq查询,这应该显示所有正确的数据。问题是所有空单元格都返回一个空值。使Linq查询无法正常工作。
我有以下结果:
C#:
var q =来自dataContext.table1中的表
        where table.column1.contains(dgv.currentrow.cells[0].value.tostring()) && table.column2.contains(dgv.currentrow.cells[1].value.tostring()) && ...... table.columnN.contains(dgv.currentrow.cells[N].value.tostring())
        select table;

这是行不通的,但是我不知道如何解决它,所以它确实起作用了!
 
已加入
2013年11月5日
留言内容
8
编程经验
Beginner
可能的答案

好的!!知道了!

我知道这不是执行此操作的最佳方法,返回所有记录然后开始过滤,但这是我能想到的唯一方法。因此,如果有人知道更好的处理方法,请告诉我!
我所拥有的是:

C#:
var q =来自dataContext.table1中的表
        select table;
if(!string.IsNullOrEmpty(dgv.currentrow.cells[0].value.tostring())
{
     q = q.Where(table => table.column1.contains(dgv.currentrow.cells[0].value.tostring())
}

if(!string.IsNullOrEmpty(dgv.currentrow.cells[1].value.tostring())
{
     q = q.Where(table => table.column1.contains(dgv.currentrow.cells[1].value.tostring())
}

if(!string.IsNullOrEmpty(dgv.currentrow.cells[N].value.tostring())
{
     q = q.Where(table => table.column1.contains(dgv.currentrow.cells[N].value.tostring())
}

这样,首先收集所有数据,然后按每个可能输入的字段过滤。我不确定该表中成千上万的行的性能如何。

因此,欢迎提出任何改进建议!
 
已加入
2013年11月5日
留言内容
8
编程经验
Beginner
我使用的是Linq,通常使用datagridview绑定到datacontext。

var q =来自dataContext.table1中的表
select table;
当我想在该表中搜索数据时,我取消绑定了datagridview,只有一行。用户可以放入过滤器。之后,我想用过滤后的数据填充datagridview。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,535
地点
悉尼,澳大利亚
编程经验
10+
我使用的是Linq,通常使用datagridview绑定到datacontext。

var q =来自dataContext.table1中的表
select table;
当我想在该表中搜索数据时,我取消绑定了datagridview,只有一行。用户可以放入过滤器。之后,我想用过滤后的数据填充datagridview。

我实际上删除了原始帖子,因为在重新阅读您的帖子之后,我意识到这不是我想问的问题。

我不得不说,用户在将要显示数据的位置输入过滤器值听起来很狡猾。我强烈建议您进行更改,以便将过滤器输入到TextBoxes或其他内容中。而不是网格本身。

无论过滤器值来自何处,以下示例说明了如何使用单个查询有效过滤空过滤器来对多个值进行过滤:
string filter1;
string filter2;
string filter3;

// ...

var rows = from row in context.Table
           where (filter1 == string.Empty || row.Column1 == filter1) &&
                 (filter2 == string.Empty || row.Column2 == filter2) &&
                 (filter3 == string.Empty || row.Column3 == filter3)
           select row;
如果过滤器值为空字符串,则对应对中的第一个条件匹配每一行,从而有效地忽略了该过滤器。
 
最佳 底部