当字段需要先解析时,如何在linq查询中进行过滤?

时间:2012-08-31 17:28:32

标签: linq parsing linq-to-sql

我有一个包含多个列的数据表和一个存储有些复杂文本模式的列 - 我需要解析该字段以确定特定子字符串是否存在于较大字符串模式中的特定位置,然后如果记录应该是因此过滤掉了。

除了用String.Split方法调用,foreach等编写C#解析函数之外,我看不到执行解析的方法。但是如果我尝试解析这样:

var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1' 
                                        && ParseIsMyItemInColumn2(t) );

我得到“没有支持的SQL转换”错误。

我想到的另一个选择是在没有Parse的情况下构建初始结果:

var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1' );

并遍历IQueryable结果集,使用parse函数测试每一行,以过滤掉不需要的行,但IQueryable没有删除不需要的行的Remove函数,也没有添加函数以允许我构建新的结果集。

那么当我还需要编写Parse函数时,如何在linq中进行过滤?

2 个答案:

答案 0 :(得分:2)

“数据库中的初始过滤器然后在本地执行其余操作”很简单:

var filtered = _db.MyTable.Where(t => t.Column1 == "Filter1")
                          .AsEnumerable() // Do the rest locally
                          .Where(t => ParseIsMyItemInColumn2(t));

AsEnumerable是一个简单的传递方法,但由于结果输入为IEnumerable<T>而不是IQueryable<T>,后续的LINQ操作使用{{1}中的LINQ to Objects方法而不是Enumerable中的那些。

显然,如果 lot 的项目与第一个过滤器匹配但是第二个过滤器失败,那将不会非常有效......

答案 1 :(得分:2)

不幸的是,如果&#34;解析函数&#34;不是可以转换为SQL的东西,你需要提取结果并使用LINQ to Objects:

var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1')
                         .AsEnumerable().Where(ParseIsMyItemInColumn2);

请注意,这会将所有结果传输到内存中,然后执行解析。