DynamicLINQ - 在字符串中转义双引号

时间:2014-04-21 15:05:44

标签: c# dynamic-linq

我正在尝试使用 DynamicLINQ 库来创建动态过滤系统。当你做类似的事情时,我发现一切顺利:找到名字的人是鲍勃:

Context.Users.Where("FirstName == \"Bob\"");

但是当我想要做的时候遇到问题:找到名字的人是“Bob”(Bob在数据源中以双引号存储)。

我尝试了一些不同的东西,包括逃避转义双引号和其他一些变种:

Context.Users.Where("FirstName == \"\\\"Bob\\\"\"");
// or as a literal for readability
Context.Users.Where(@"FirstName == ""\""Bob\""""");
// From comments below
Context.Users.Where("FirstName == \"\"Bob\"\"");

这些都不起作用。任何帮助将不胜感激。

感谢。

编辑 - 我现在正在处理结果字符串。实际字符串是从模型生成的。

2 个答案:

答案 0 :(得分:3)

如果你想在in子句中使用一些带有特殊符号的特定字符串,那么更好的方法,就像我认为的那样,使用像这样的paramtrized形式

Context.Users.Where("FirstName == @0", "\"Bob\"");

答案 1 :(得分:0)

我的想法是你不能像你写的那样使用.Where()进行动态linq评估。原因是因为Where()不了解FirstName是什么,并且从未打算做动态Linq表达式。您可以使用以下内容 .Where( x => x.FirstName == "\"Bob\"");这肯定会有用。

良好的开端是使用ScottGu博客上的现有资料库,如下所示:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

他下载的代码可以完成您所描述的所有内容。消化图书馆需要一点时间,但我已经在项目中使用它并且效果很好。你需要了解一点Lambda,你会走得很远。

希望这会有所帮助:)好问题,我去过那里并做到了。找到这个解决方案很棘手。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 修改

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

看看Dynamic.cs:

第2123行方法ParseToken()中存在以下代码。

            case '"':
            case '\'':
                char quote = ch;
                do
                {
                    NextChar();
                    while (textPos < textLen && ch != quote) NextChar();
                    if (textPos == textLen)
                        throw ParseError(textPos, Res.UnterminatedStringLiteral);
                    NextChar();
                } while (ch == quote);
                t = TokenId.StringLiteral;
                break;

这个解析器似乎正在做的是:当它读取"中的第二个[""Bob""]时,它返回一个空字符串Literal,认为它找到了字符串文字的结尾,然后它会解析标识符[Bob],然后是另一个空字符串文字。不知何故,您将不得不修改解析器以查找""作为标记。

也许在第766行的ParseComparison()中,您可以设计一种方法来查找null String Literal,后跟一个标识符,后跟另一个null String Literal。 ???

简单的解决方案是将"替换为null,因为重写解析器看起来像是一项重大工作。