2

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

除了通过使用 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 没有删除不需要的行的删除函数,也没有添加函数来允许我建立一个新的结果集。

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

4

2 回答 2

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 操作使用 LINQ to Objects 方法Enumerable而不是Queryable.

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

于 2012-08-31T17:30:41.953 回答
2

不幸的是,如果“解析函数”不能转换为 SQL,您将需要提取结果并使用 LINQ to Objects:

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

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

于 2012-08-31T17:30:58.283 回答