.NET 3.5, C#Est-ce que LINQ to SQL peut interroger un champ XML DB-côté serveur?
J'ai une application web avec une fonction de "recherche". Certains des champs qui sont consultables sont des colonnes de première classe dans la table, mais certains d'entre eux sont en fait des champs imbriqués dans un type de données XML.
Auparavant, j'ai construit un système pour construire dynamiquement le SQL pour ma recherche. J'avais une belle hiérarchie de classes qui construisait des expressions SQL et des instructions conditionnelles. Le seul problème était qu'il n'était pas à l'abri des attaques par injection SQL. Je lisais l'excellent article de Rob Conery (http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/) qui indiquait que plusieurs requêtes peuvent être combinées en une seule requête TSQL pour le serveur si le résultat IQueryable n'est jamais énuméré. Cela m'a amené à penser que ma construction de recherche dynamique était beaucoup trop compliquée - j'avais juste besoin de combiner plusieurs expressions LINQ.
Par exemple (pièce):
Auteur: ID (int), LastName (varchar (32)), FirstName (varchar (32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
résultats dans les domaines suivants requête:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
Je réalise cela pourrait être la solution idéale pour une génération de requête dynamique simple qui est sûr de SQL injection - Je boucle juste sur mon résultat IQueryable et j'exécute des expressions conditionnelles supplémentaires pour obtenir mon expression finale à exécution unique.
Cependant, je ne trouve aucun support pour l'évaluation des données XML. En TSQL, pour obtenir une valeur à partir d'un noeud XML, nous aimerions faire quelque chose comme
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
Mais je ne trouve pas le LINQ to SQL équivalent de la création de cette évaluation. En existe-t-il un? Je sais que je peux évaluer toutes les conditions DB non-XML côté, et puis faire mon côté d'évaluations XML, mais mes données sont assez grandes que A) c'est beaucoup de trafic réseau pour faire glisser sur la performance et B) Je vais sortir ... des exceptions de mémoire si je ne peux pas évaluer le premier côté de la base de données XML pour exclure certains ensembles de résultats.
Des idées? Suggestions?
Question supplémentaire - Si l'évaluation XML est en fait possible côté DB, qu'en est-il du support FLWOR?
C'est la fin de l'année 2013 - les mises à jour? –
@BenjaminGruenbaum Cela fait longtemps que j'ai réfléchi à cette question. Mon cas d'utilisation a disparu quand j'ai changé d'emploi entre maintenant et maintenant. Le mieux que je me souvienne, j'ai utilisé l'approche recommandée par DanialM ci-dessous, qui était de faire un appel à une fonction définie par l'utilisateur. Je ne peux pas dire comme j'ai remarqué un support direct dans LINQ depuis (mais je n'ai pas regardé non plus) – Matt
Intéressant - Je vais essayer de pêcher de nouvelles réponses 5 ans plus tard avec une prime. –