回答

收藏

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

技术问答 技术问答 159 人阅读 | 0 人回复 | 2023-09-13

.NET 3.5,C#
6 x- D1 y0 j9 B  l1 U8 \* n8 u我有一个具有“搜索”功能的网络应用程序。可搜索的某些字段是表中的第一类列,但实际上其中一些是XML数据类型内的嵌套字段。
* [3 ?* G# J& S以前,我构建了一个用于动态构造用于搜索的SQL的系统。我有一个很好的类层次结构,可以构建SQL表达式和条件语句。唯一的问题是它不受SQL注入攻击的威胁。5 E* m7 {1 Q: r+ r( @& j1 W
我正在阅读Rob Conery的精彩文章,该文章指出,如果从未枚举IQueryable结果,则多个查询可以合并到服务器的单个TSQL查询中。这使我想到我的动态搜索结构太复杂了-8 X) l& k# J* j
我只需要组合多个LINQ表达式即可。( q5 l& S' _  U7 }$ L
例如(人为):4 W4 P# [$ _( r& ~0 Q' }9 s
Author:
6 z2 ?) V. D/ q    ID (int),
: `7 T4 i  O0 L* B    LastName (varchar(32)),
8 ?8 i3 a) m6 Y) S9 O" z/ v    FirstName (varchar(32))
  P/ n+ I6 r, p7 O+ Q4 L    context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")9 o# E3 p9 @! L" m; Q4 E
结果如下查询:
" E1 P6 X' K8 @9 x5 p: BSELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
8 x. F& B& Z  w; UFROM [dbo].[Author] AS [t0]
7 {  \: }* g# B" [WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)  I, w6 b1 [/ J
我意识到这对于通过SQL注入是安全的简单动态查询生成而言可能是完美的解决方案-我将遍历IQueryable结果并执行其他条件表达式以获取最终的单执行表达式。* B  k2 P7 L# D$ e3 ^
但是,我找不到对XML数据评估的任何支持。在TSQL中,要从XML节点获取值,我们会做类似的事情( H1 H' p. T3 r, C# a$ Y$ Y
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
( F7 }) L1 U5 u& r+ Z( _但是我找不到相当于创建此评估的LINQ to2 z0 z& n6 u! V1 t
SQL。是否存在?我知道我可以在数据库端评估所有非XML条件,然后在XML评估端进行评估,但是我的数据足够大,以至于A)大量的网络流量会拖累性能,并且B)我会不满意-! k3 I( _! u+ `: Y" f, b
内存异常,如果我无法评估XML首先在数据库方面排除某些结果集。$ Q9 u" p+ D: h* o( D, ^
有想法吗?有什么建议吗?  P) ]( ~/ W" H1 V. G7 D* f
额外的问题-如果实际上XML评估可能是数据库方面的,那么FLWOR支持呢?# Y, E6 @) w) D# J1 v
                7 |+ \1 V6 @8 ]1 f- ]
解决方案:$ f  d+ j0 `$ k" [! v
               
* \' Z* ]4 u' y; w
5 h4 O0 \- Q$ v1 \  t7 U/ h) e9 A" m% K5 \1 V  S; r
                现在,这是一个有趣的问题。
3 y1 x% w, s/ c% x. c5 [现在,您不能指示SQL) G' U8 ^+ m- [9 a/ j+ |  l
Server直接从Linq执行XML功能。但是,您可以让Linq使用用户定义的函数…因此,您可以设置udf来处理xml,获取正确的数据等,然后在Linq表达式中使用它。这将在服务器上执行,并应执行您想要的操作。但是,有一个重要的限制:您要查找的XML路径(to的第一个参数xmlColumn.value或类似参数)必须内置到函数中,因为它必须是字符串
; f( r, A. n* F# D, U$ y  A* [文字 ,不能通过输入参数来构建(例如)。因此,您可以使用UDF来获取编写UDF时了解的字段,但不能用作从XML列获取数据的通用方法。  j3 p; f2 l7 \, K
查阅Scott Gutherie出色的有关Linq toSQL的Blog系列的“支持用户定义函数(UDF)”部分,以获取有关实现的更多信息。
( V- }! v# O$ G6 p& s& ?  R希望这可以帮助。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则