LINQ to SQL – Xml Field Problème – À quel point pouvez-vous intercepter le TSQL généré?

Notre développement est tombé sur un obstacle majeur en termes de Linq à Sql et Sql 2005+ Xml Fields. Nous avons un champ blob Xml contenant des champs …

<Profile name-first="Terry" name-last="Aney" [...more]/> 

Pour tirer parti de LINQ to SQL, nous avons créé une fonction UDF dans SQL et nous l'avons ajoutée à notre DataContext pour l'appeler (de manière lâche à partir de LINQ to SQL (Partie 6 – Récupération de données à l'aide de procédures stockées) ). Cependant, lorsque nous utilisons ces fonctions, l'indexing XML par SQL est rendue inutile. Une requête filtrée et ordonnée contre une population de 14 000 lignes et elle expire avec le CommandTimeout par défaut de 30 secondes. Mais si nous prenons le text de la command (sniffé par SQL Profiler) et que nous échangeons le file UDF avec XQuery direct, la requête prend less d'une seconde (évidemment ce que nous voulons). J'ai vu des questions similaires sur les champs Xml (c'est-à – dire cette question ) mais la réponse commune est d'utiliser les fonctions UDF – mais nous avons prouvé que celles-ci sont inefficaces si elles sont largement utilisées.

Nous espérons qu'il existe un sharepoint bas niveau où nous pouvons récupérer le text de la command et échanger le file UDF avec la syntaxe XQuery appropriée (via un RegEx). Pas idéal, mais c'est la seule solution que nous pouvons envisager. Nous sums ouverts à tout: traduction de text de command, intégration CLR avec SQL, etc.

Dans certaines situations, nous pourrions déjà le faire. Par exemple, si nous avons toujours un IQueryable où T n'est pas un type anonyme et / ou complexe / nested, nous pourrions appeler GetCommandText et ensuite appeler DataContext.Translate (). Cependant, pour les types anonymes / complexes et / ou les requêtes scalaires, nous ne voyons pas d'endroit où se connecter.

Toutes les suggestions sont grandement appréciées.

Donc, voici quelques reflections, la fonction dans ce sera appelé pour chacune des lignes returnnées ce qui rend la performance lâche, mais apparemment Linq to SQL n'est pas un grand fan des champs XML comme vous l'avez probablement remarqué. Donc, une solution possible est d'essayer d'optimiser vraiment la fonction et la meilleure façon de le faire est d'utiliser SQLCLR, alors jetez un oeil à ce lien et voyez comment il l'a fait.

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

Pour info, mon collègue a «résolu» le problème. Un peu "diabolique" mais faisant le boulot pour nous. http://chriscavanagh.wordpress.com/2011/03/12/manipulating-linq-to-sql-command-text/

Donc, fondamentalement, maintenant que nous pouvons le modifier, nous avons créé des fonctions 'espace réservé' dans notre DataContext L2S qui sont évidemment des fonctions UDF. Mais nous intercepter la command, et les échanger pour la bonne valeur XQuery / exists () syntaxe pour s'assurer qu'il est aussi performant que possible.