.NET 3.5, C#
J'ai une application web avec une fonction de recherche. Certains de ces champs sont consultables sont de première classe de colonnes dans le tableau, mais certains d'entre eux sont en fait des champs imbriqués à l'intérieur d'un type de données XML.
Auparavant, j'ai construit un système dynamique de la construction de la SQL pour ma recherche. J'ai eu une belle hiérarchie de classe qui construit des expressions SQL et les instructions conditionnelles. Le seul problème était qu'il n'était pas sûr d'attaques par injection SQL.
Je lisais Rob Conery l'excellent article (http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/), qui a souligné que plusieurs requêtes peuvent être combinées en une seule requête TSQL pour le serveur si le IQueryable résultat n'est jamais énumérés. Cela me fait penser que ma recherche dynamique de la construction a été beaucoup trop compliqué - j'ai juste besoin de combiner plusieurs expressions LINQ.
Par exemple (fictive):
Auteur: ID (int), Nom (varchar(32)), Prénom (varchar(32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
Les résultats de la requête suivante:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
J'ai réalisé que cela pourrait être la solution parfaite pour une simple dynamique de génération de requête, c'est à l'abri de l'injection SQL - je venais en boucle sur mon IQueryable de résultat et d'exécuter d'autres expressions conditionnelles pour obtenir mon dernier single-exécution de l'expression.
Cependant, je ne trouve pas de soutien pour l'évaluation des données XML. En TSQL, pour obtenir une valeur à partir d'un nœud XML, nous ferions 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. N'existe? Je sais que je peux évaluer tous les non-XML conditions DB côté, et puis faire de mon XML évaluations code côté, mais mes données sont suffisamment gros pour qu'Un) c'est beaucoup de trafic réseau à glisser sur la performance et B), je vais sortir-de-la mémoire des exceptions si je ne peux pas évaluer le XML première DB côté pour exclure certains ensembles de résultats.
Des idées? Des Suggestions?
Question Bonus - Si XML de l'évaluation est en effet possible DB côté, qu'en est FLWOR de soutien?