【发布时间】:2010-09-21 21:30:02
【问题描述】:
.NET 3.5,C#
我有一个带有“搜索”功能的网络应用程序。一些可搜索的字段是表中的一等列,但其中一些实际上是 XML 数据类型中的嵌套字段。
以前,我构建了一个系统,用于为我的搜索动态构建 SQL。我有一个很好的类层次结构,可以构建 SQL 表达式和条件语句。唯一的问题是它对 SQL 注入攻击并不安全。
我正在阅读Rob Conery's excellent article,它指出如果从未枚举 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。一个存在吗?我知道我可以在 DB 端评估所有非 XML 条件,然后在代码端进行 XML 评估,但是我的数据足够大,以至于 A)有很多网络流量会拖累性能,B)我会出去-如果我无法评估 XML 第一个 DB 端以排除某些结果集,则会出现内存异常。
想法?建议?
额外问题 - 如果 XML 评估实际上是可能的 DB 端,那么 FLWOR 支持呢?
【问题讨论】:
-
2013 年结束了 - 有什么更新吗?
-
@BenjaminGruenbaum 很久没有想到这个问题了。当我从那时到现在换工作时,我的用例就消失了。我记得最好的是,我使用了下面推荐的 DanialM 方法,即调用用户定义的函数。不能说,因为从那以后我注意到 LINQ 有任何直接支持(但我也没有看过)
-
有趣 - 我会在 5 年后尝试用赏金钓到新的答案。
标签: sql xml linq-to-sql .net-3.5