4

在 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(第 6 部分 - 使用存储过程检索数据) )。但是,当我们使用这些函数时,SQL 的 XML 索引就变得毫无用处了。针对 14,000 行的过滤和有序查询,默认为 30 秒 CommandTimeout。但是,如果我们使用命令文本(由 SQL Profiler 嗅探)并使用直接 XQuery 替换 UDF,则查询需要不到一秒钟的时间(显然是我们想要的)。我见过关于 Xml Fields 的类似问题(即这个问题),但常见的答案是使用 UDF——但我们已经证明,如果广泛使用这些是低效的。

我们希望有一些低级别的点,我们可以获取命令文本并使用正确的 XQuery 语法(通过 RegEx)替换 UDF。不理想,但这是我们认为可行的唯一解决方案。我们对任何事情都持开放态度——命令文本翻译、CLR 与 SQL 的集成等。

在某些情况下,我们已经可以这样做了。例如,如果我们总是有一个 IQueryable,其中 T 不是匿名和/或复杂/嵌套类型,我们可以调用 GetCommandText,然后调用 DataContext.Translate()。但是,对于匿名/复杂类型和/或标量查询,我们看不到可以挂钩的地方。

非常感谢任何建议。

4

2 回答 2

1

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

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

于 2011-02-18T07:52:21.197 回答
0

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

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

于 2011-03-14T18:41:55.757 回答