【发布时间】:2011-02-11 17:47:37
【问题描述】:
在 Linq to Sql 和 Sql 2005+ Xml Fields 方面,我们的开发遇到了一个主要障碍。我们有一个包含字段的 Xml blob 字段...
<Profile name-first="Terry" name-last="Aney" [...more]/>
为了利用 LINQ to SQL,我们在 SQL 中创建了一个 UDF,并将其添加到我们的 DataContext 并调用它(大致基于 LINQ to SQL (Part 6 - Retrieving Data Using Stored Procedures) )。然而,当我们使用这些函数时,SQL 的 XML Indexing 就变得毫无用处了。针对 14,000 行的过滤和有序查询,它超时,默认为 30 秒 CommandTimeout。但是,如果我们使用命令文本(由 SQL Profiler 嗅探)并使用直接 XQuery 替换 UDF,则查询时间不到一秒钟(显然是我们想要的)。我已经看到有关 Xml 字段的类似问题(即this question),但常见的答案是使用 UDF - 但我们已经证明,如果广泛使用这些是低效的。
我们希望有一些低级别的点,我们可以获取命令文本并使用正确的 XQuery 语法(通过 RegEx)替换 UDF。不理想,但这是我们认为可行的唯一解决方案。我们对任何事情都持开放态度——命令文本翻译、CLR 与 SQL 的集成等等。
在某些情况下,我们已经可以这样做了。例如,如果我们总是有一个 IQueryable,其中 T 不是匿名和/或复杂/嵌套类型,我们可以调用 GetCommandText,然后调用 DataContext.Translate()。但是,对于匿名/复杂类型和/或标量查询,我们看不到可以挂钩的地方。
非常感谢任何建议。
【问题讨论】:
-
你在dataContext上使用过getCommand方法吗?
-
在某些情况下无法使用。我更新了上面的文本,说明我们可以在哪里调用 GetCommandText,但它并不能解决所有情况(否则如果它确实我们会丢失它)。如果我们只是有一个低级别的点来挂钩(即某种提供程序模型),我们可以用 RegEx 用适当的 XQuery 表示法替换我们的 UDF,然后将其重新分配给命令执行,它会解决我们所有的问题。
标签: sql-server linq-to-sql datacontext xquery sqlxml