【问题标题】:Filtering database records by xml column content using linq-to-sql and xlinq使用 linq-to-sql 和 xlinq 按 xml 列内容过滤数据库记录
【发布时间】:2009-11-17 18:45:02
【问题描述】:

我需要使用 xml-type 列过滤从数据库表中选择行。

表格看起来像(短版)

id
dbfield int
xmlfield xml

我正在以这种方式过滤它

IQueryable<Data.entity> q = from u in datacontex.entities
select u;

if (val1.HasValue)
  q = q.Where( x => x.dbfield > val1.value)

if (val2.HasValue)
  q = q.Where( x=> x.dbfield < val2.value)

if (!string.IsNullOrEmpty(searchString))
 q = q.Where ( x=> x.xmlfield contains values from searchString)

xmlfield中的XML看起来很简单

<doc>
  <item id="no">test/WZ/2009/04/02</item>
  <item id="title">blabla</item>
...

问题是如何在 linq 中添加 WHERE 条件,最好将此条件转换为 ms-sql 查询,而不需要在 web 服务应用程序上处理数据集。

谢谢。

【问题讨论】:

    标签: linq linq-to-sql linq-to-xml


    【解决方案1】:

    LINQ-to-SQL 不支持 TSQL 中的 xml 扩展。我看到的两个选择:

    • 为您的整个查询编写一个使用 sql/xml 语法的 SPROC/udf,并将其映射到您的数据上下文
    • 编写一个对单行进行测试的 UDF(返回一个布尔值),将其映射到数据上下文,并在 LINQ 的 where 子句中使用 ctx.SomeUdf(row)

    【讨论】:

      【解决方案2】:

      您还可以在 SQL Server 表上创建计算列,从 XML 中提取这些点点滴滴,并将它们存储为表中的“普通”字段。我一直在生产系统的各个地方使用该技术 - 效果很好。

      完成此操作后,您可以使用普通表字段,并且可以使用它们在 Linq-to-SQL 中进行过滤 - 没问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多