我正在尝试使用 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\"\"");
这些都不起作用。任何帮助将不胜感激。
感谢。
编辑 - 我现在正在处理结果字符串。实际字符串是从模型生成的。
答案 0 :(得分:3)
如果你想在in子句中使用一些带有特殊符号的特定字符串,那么更好的方法,就像我认为的那样,使用像这样的paramtrized形式
Context.Users.Where("FirstName == @0", "\"Bob\"");
答案 1 :(得分:0)
我的想法是你不能像你写的那样使用.Where()
进行动态linq评估。原因是因为Where()
不了解FirstName
是什么,并且从未打算做动态Linq表达式。您可以使用以下内容
.Where( x => x.FirstName == "\"Bob\"");
这肯定会有用。
良好的开端是使用ScottGu博客上的现有资料库,如下所示:
他下载的代码可以完成您所描述的所有内容。消化图书馆需要一点时间,但我已经在项目中使用它并且效果很好。你需要了解一点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,因为重写解析器看起来像是一项重大工作。