我有一个包含多列和一列的数据表,其中存储了一些复杂的文本模式 - 我需要解析该字段以确定特定的子字符串是否存在于较大的字符串模式中的特定位置,然后记录是否应该结果被过滤掉。
除了使用 String.Split 方法调用、foreach 等编写 C# 解析函数之外,我看不到执行解析的方法。但是如果我尝试像这样解析:
var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1'
&& ParseIsMyItemInColumn2(t) );
我收到“不支持 SQL 转换”错误。
我想到的另一个选择是在没有解析的情况下构建初始结果:
var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1' );
并迭代 IQueryable 结果集,使用解析函数测试每一行,以过滤掉不需要的行,但 IQueryable 没有删除不需要的行的功能,也没有添加功能来允许我构建新的结果集。
当我还需要编写 Parse 函数时,如何在 linq 中进行过滤?
最佳答案
“在数据库中进行初始过滤,然后在本地执行其余操作”很简单:
var filtered = _db.MyTable.Where(t => t.Column1 == "Filter1")
.AsEnumerable() // Do the rest locally
.Where(t => ParseIsMyItemInColumn2(t));
AsEnumerable
是一个简单的传递方法,但是因为结果输入为 IEnumerable<T>
而不是IQueryable<T>
,后续 LINQ 操作使用 Enumerable
中的 LINQ to Objects 方法。而不是Queryable
中的那些.
显然,如果很多项目与第一个过滤器匹配但在第二个过滤器中失败,那么效率不会很高......
关于linq - 当字段需要首先解析时,如何在 linq 查询中进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12219999/