回答

收藏

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

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

.NET 3.5,C#
$ z1 t" S) E7 F: C9 i3 R我有一个具有“搜索”功能的网络应用程序。可搜索的某些字段是表中的第一类列,但实际上其中一些是XML数据类型内的嵌套字段。; z: O; z4 Z/ F; [
以前,我构建了一个用于动态构造用于搜索的SQL的系统。我有一个很好的类层次结构,可以构建SQL表达式和条件语句。唯一的问题是它不受SQL注入攻击的威胁。8 |5 j8 E# O8 u& \: S
我正在阅读Rob Conery的精彩文章,该文章指出,如果从未枚举IQueryable结果,则多个查询可以合并到服务器的单个TSQL查询中。这使我想到我的动态搜索结构太复杂了-
# s! m8 U# G( Q. n* Q我只需要组合多个LINQ表达式即可。' c8 p( s! s6 n. p( [" n; K
例如(人为):
5 w/ ~$ E) a$ B- x6 [Author:
8 N% j) t1 g, j' P1 J    ID (int),8 x, V* P7 i4 l& y
    LastName (varchar(32)),
8 \# V6 @8 @0 H! l1 s  k3 @0 Q    FirstName (varchar(32))- M2 J% V+ L1 P- a, X$ Q
    context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")% G# r$ [+ w. M- M$ K% c- W. ^+ C% U
结果如下查询:9 o6 z& b9 }) d8 x; U4 I2 m
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
3 I$ Z, s4 \8 V" kFROM [dbo].[Author] AS [t0]
2 \; I* x7 i+ ~- I+ z  ^WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
& e, e0 Y/ R7 D, `我意识到这对于通过SQL注入是安全的简单动态查询生成而言可能是完美的解决方案-我将遍历IQueryable结果并执行其他条件表达式以获取最终的单执行表达式。
4 r7 w) O( t; i* F" E% e, b但是,我找不到对XML数据评估的任何支持。在TSQL中,要从XML节点获取值,我们会做类似的事情' g( R9 J7 t2 s
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
0 W" \+ P& ^) ^但是我找不到相当于创建此评估的LINQ to
% }% ^) d& s2 b$ q4 L9 W% {SQL。是否存在?我知道我可以在数据库端评估所有非XML条件,然后在XML评估端进行评估,但是我的数据足够大,以至于A)大量的网络流量会拖累性能,并且B)我会不满意-1 x9 _$ q9 j7 p. K6 ?
内存异常,如果我无法评估XML首先在数据库方面排除某些结果集。4 t# `; k3 {: S8 k
有想法吗?有什么建议吗?
0 e" ~/ \0 N4 i* w; J( L额外的问题-如果实际上XML评估可能是数据库方面的,那么FLWOR支持呢?1 ^) }! d) J8 J& o5 J) P, e) W
                * L; ?( T2 I2 F2 V; A# \. a3 S" I
解决方案:
; q4 s1 N1 R' p- J3 D, \6 o                ' d2 t3 `/ C) k. q2 k; I" e  i

/ H4 J  C2 g; U5 u0 V$ p& X: _& Z: g0 X
                现在,这是一个有趣的问题。( q9 E: D& ]( y
现在,您不能指示SQL+ g2 _: Q  A) V+ [3 E. j: W
Server直接从Linq执行XML功能。但是,您可以让Linq使用用户定义的函数…因此,您可以设置udf来处理xml,获取正确的数据等,然后在Linq表达式中使用它。这将在服务器上执行,并应执行您想要的操作。但是,有一个重要的限制:您要查找的XML路径(to的第一个参数xmlColumn.value或类似参数)必须内置到函数中,因为它必须是字符串
3 @" p( T( _% d文字 ,不能通过输入参数来构建(例如)。因此,您可以使用UDF来获取编写UDF时了解的字段,但不能用作从XML列获取数据的通用方法。. r! n& o' v, {9 P
查阅Scott Gutherie出色的有关Linq toSQL的Blog系列的“支持用户定义函数(UDF)”部分,以获取有关实现的更多信息。
3 o: K5 A6 d) A! {6 Q7 q希望这可以帮助。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则