.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支持呢?
现在,这是一个有趣的问题。
现在,您不能指示SQL Server直接从Linq执行XML功能。但是,您可以让Linq使用用户定义的函数…因此,您可以设置udf来处理xml,获取正确的数据等,然后在Linq表达式中使用它。这将在服务器上执行,并应执行您想要的操作。但是,有一个重要的限制:您要查找的XML路径(to的第一个参数xmlColumn.value或类似参数)必须内置到函数中,因为它必须是字符串 文字 ,不能通过输入参数来构建(例如)。因此,您可以使用UDF来获取编写UDF时了解的字段,但不能用作从XML列获取数据的通用方法。
xmlColumn.value
查阅Scott Gutherie出色的有关Linq toSQL的Blog系列的“支持用户定义函数(UDF)”部分,以获取有关实现的更多信息。
希望这可以帮助。