.NET 3.5, C#
我有一个带有“搜索”功能的Web应用程序。其中一些可搜索的字段是表中的一级列,但实际上,有些字段是嵌套在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 以排除某些结果集,则会出现 out-of-memory 异常。
有什么想法?建议?
附加问题 - 如果数据库端实际上支持 XML 评估,那么 FLWOR 支持呢?