【问题标题】:Search string in cdata block在 cdata 块中搜索字符串
【发布时间】:2014-10-02 02:47:53
【问题描述】:

我的 Microsoft SQL Server 表的其中一列包含格式为 XML 的字符串

<root>
    <de><![CDATA[something]]></de>
    <fr><![CDATA[something]]></fr>
    <it><![CDATA[something]]></it>
    <en><![CDATA[something]]></en>
</root>

<root>
    <de>something</de>
    <it>something</it>
    <fr>something</fr>
    <en>something</en>
</root>

我需要提取所有包含某个单词的记录,无论是否有CDATA。

所以我以这种方式在 LINQ 中构造了 where 条件:

vc.Url.Contains(">" + URL + "<") || vc.Url.Contains("cdata[[]" + URL + "]")

如果搜索文本匹配且没有 CDATA,则 where 条件有效,我得到结果。

如果搜索文本匹配并且存在 CDATA,则 where 条件不起作用。

如果我通过 SQL Server Management Studio 执行查询:

  where vc.Url like '%>something<%' OR vc.Url like '%cdata[[]something]%'

我得到了预期的结果。

知道如何以正确的方式编写 where 条件并通过 SQL 和 LINQ 获得相同的结果吗?

提前致谢!

【问题讨论】:

    标签: c# sql-server linq cdata


    【解决方案1】:

    Entity Framework 会自动转义传入ContainsStartsWithEndsWith 的任何特殊字符,因此您无需使用[[]。试试:

    vc.Url.Contains(">" + URL + "<") || vc.Url.Contains("cdata[" + URL + "]")
    

    【讨论】:

    • 忘记指定我使用 LLBLGenPro 作为 ORM 而不是 EF。我想这也必须工作..几分钟后我可以检查!
    • 不幸的是它不起作用。如果 URL 在 CDATA 字段中,它不会返回任何记录。如果 URL 不在 CDATA 字段中,它会很好地工作。
    • @matan:LLBLGenPro 是否可以选择跟踪生成的查询?
    • 在分析了sql语句后,我注意到有一个DLL错位。我遇到问题的类库项目的 DLL 在网站项目中被引用。事实是我正在开发新版本的类库项目,而网站仍然有对旧版本的引用。
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2019-10-06
    • 2012-07-23
    • 1970-01-01
    相关资源
    最近更新 更多