【问题标题】:LINQ to SQL - Xml Field Problem - How low down can you intercept the generated TSQL?LINQ to SQL - Xml 字段问题 - 您可以截获生成的 SQL 多低?
【发布时间】: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


【解决方案1】:

所以这里有一些想法,其中的函数将为返回的每一行调用,使其性能下降,但显然 Linq to SQL 并不是您可能注意到的 XML 字段的忠实粉丝。 所以一个可能的解决方案是尝试真正优化函数,最好的方法是使用 SQLCLR,所以看看这个链接,看看他是怎么做到的。

http://conficient.wordpress.com/2011/01/20/querying-xml-fields-in-linq-to-sql/

【讨论】:

  • 感谢您的链接。我已经发布了question,正在等待他的回复。
【解决方案2】:

仅供参考,我的同事已经“解决”了这个问题。有点“邪恶”,但为我们做这项工作。 http://chriscavanagh.wordpress.com/2011/03/12/manipulating-linq-to-sql-command-text/

所以基本上,现在我们可以修改了,我们在 L2S DataContext 中创建了一些“占位符”函数,这些函数显然是 UDF。但是我们拦截命令,并将它们换成正确的 XQuery value/exists() 语法,以确保它尽可能地高效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多