使用linq-to-sql和xlinq按xml列内容过滤数据库记录

时间:2009-11-16 10:24:18

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

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

表看起来像(短版)

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查询,而不在webservice应用程序上处理数据集。

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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