小编典典

LINQ to SQL可以查询XML字段数据库服务器端吗?

sql

.NET 3.5,C#

我有一个具有“搜索”功能的网络应用程序。可搜索的某些字段是表中的第一类列,但实际上其中一些是XML数据类型内的嵌套字段。

以前,我构建了一个用于动态构造用于搜索的SQL的系统。我有一个很好的类层次结构,可以构建SQL表达式和条件语句。唯一的问题是它不受SQL注入攻击的威胁。

我正在阅读Rob Conery的精彩文章,该文章指出,如果从未枚举IQueryable结果,则多个查询可以合并到服务器的单个TSQL查询中。这使我想到我的动态搜索结构太复杂了-
我只需要组合多个LINQ表达式即可。

例如(人为):

Author:
    ID (int),
    LastName (varchar(32)), 
    FirstName (varchar(32))

    context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")

结果如下查询:

SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)

我意识到这对于通过SQL注入是安全的简单动态查询生成而言可能是完美的解决方案-我将遍历IQueryable结果并执行其他条件表达式以获取最终的单执行表达式。

但是,我找不到对XML数据评估的任何支持。在TSQL中,要从XML节点获取值,我们会做类似的事情

XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()

但是我找不到相当于创建此评估的LINQ to
SQL。是否存在?我知道我可以在数据库端评估所有非XML条件,然后在XML评估端进行评估,但是我的数据足够大,以至于A)大量的网络流量会拖累性能,并且B)我会不满意-
内存异常,如果我无法评估XML首先在数据库方面排除某些结果集。

有想法吗?有什么建议吗?

额外的问题-如果实际上XML评估可能是数据库方面的,那么FLWOR支持呢?


阅读 165

收藏
2021-05-05

共1个答案

小编典典

现在,这是一个有趣的问题。

现在,您不能指示SQL
Server直接从Linq执行XML功能。但是,您可以让Linq使用用户定义的函数…因此,您可以设置udf来处理xml,获取正确的数据等,然后在Linq表达式中使用它。这将在服务器上执行,并应执行您想要的操作。但是,有一个重要的限制:您要查找的XML路径(to的第一个参数xmlColumn.value或类似参数)必须内置到函数中,因为它必须是字符串
文字 ,不能通过输入参数来构建(例如)。因此,您可以使用UDF来获取编写UDF时了解的字段,但不能用作从XML列获取数据的通用方法。

查阅Scott Gutherie出色的有关Linq toSQL的Blog系列的“支持用户定义函数(UDF)”部分,以获取有关实现的更多信息。

希望这可以帮助。

2021-05-05