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

标签 linq parsing linq-to-sql

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

除了使用 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/

相关文章:

asp.net-mvc - 将存储过程与具有附加参数的 Linq To Sql 一起使用

c# - LINQ,查询的大过滤器

c# - 列表在调试器中显示 4 个项目,即使只填充了一个元素

javascript - BugHunt - Javascript 解析错误?

IP地址和协议(protocol)的Python解析日志文件

c# - 删除插入时的非唯一数据

c# - 将 2 个 LINQ 组合成一个调用

c# - Linq 选择不同的内部值

c# - 返回计数列表并按 id linq to sql 分组

parsing - 逻辑表达式解析器