当前位置: 首页 > 面试题库 >

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

颜志业
2023-03-14
问题内容

.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)大量的网络流量会拖累html" target="_blank">性能,并且B)我会不满意-
内存异常,如果我无法评估XML首先在数据库方面排除某些结果集。

有想法吗?有什么建议吗?

额外的问题-如果实际上XML评估可能是数据库方面的,那么FLWOR支持呢?


问题答案:

现在,这是一个有趣的问题。

现在,您不能指示SQL
Server直接从Linq执行XML功能。但是,您可以让Linq使用用户定义的函数…因此,您可以设置udf来处理xml,获取正确的数据等,然后在Linq表达式中使用它。这将在服务器上执行,并应执行您想要的操作。但是,有一个重要的限制:您要查找的XML路径(to的第一个参数xmlColumn.value或类似参数)必须内置到函数中,因为它必须是字符串
文字 ,不能通过输入参数来构建(例如)。因此,您可以使用UDF来获取编写UDF时了解的字段,但不能用作从XML列获取数据的通用方法。

查阅Scott Gutherie出色的有关Linq toSQL的Blog系列的“支持用户定义函数(UDF)”部分,以获取有关实现的更多信息。

希望这可以帮助。



 类似资料:
  • 我经常遇到这个错误,以至于php_error日志文件每2秒增加1MB。并且站点非常慢。 我试着把这条线添加到wp-db.php 但这并没有帮助。 Web服务器是IIS 7,最新版本的mysql和wordpress

  • 接手的老项目,其中有一条sql是 'select * from a库.dbo.b库的表' 这个条sql在原库上是可以查询的。 现在有一台新的服务器要迁移数据,我同样创建了两个库 但我执行 'select * from a库.dbo.b库的表'这个sql时,提示找不到。 这说明原库上做了某些设置,不知道如何解决了。 同时a库能查询b库的所有表 ,b库不能查询a库的表。 求助 (a库是没有b库的表的)

  • 问题内容: 我正在寻找一种处理以下情况的方法: 我们有一个数据库服务器,上面有多个数据库(所有数据库都有相同的架构,不同的数据)。 我们正在寻找一种查询所有数据库的方法(并且它易于配置,因为可以随时添加更多数据库)。此数据访问必须是实时的。 举例来说,假设您有一个插入订单的应用程序- 每个应用程序都有自己的数据库等。我们正在寻找的是一种有效的方式,使单个应用程序可以访问所有其他数据库中的订单信息,

  • 我对firestore(和编程)比较陌生,无法在网上找到解决问题的方法。 如果还有什么可能有帮助的,请告诉我。谢谢! 编辑以显示下一次尝试:

  • 问题内容: 我正在寻找一些通用策略,用于将中央服务器上的数据与并不总是在线的客户端应用程序进行同步。 在我的特定情况下,我有一个带sqlite数据库的android手机应用程序和一个带MySQL数据库的PHP Web应用程序。 用户将能够在电话应用程序和Web应用程序上添加和编辑信息。我需要确保即使手机无法立即与服务器通信,在一个地方所做的更改也会在所有地方反映出来。 我不关心如何将数据从手机传输

  • 问题内容: 我正在尝试使用sql语句从XML文档中获取特定数据。该文件如下: 我输入了sql查询以获取球体中值,如下所示: 但是我出错了 [错误]执行(4:17):ORA-19228:XPST0008-未声明的标识符:前缀’nsREF’本地名称’nsREF:Measure’ 您能帮我获得正确的价格吗 问题答案: Oracle安装程序 查询 : 输出 :