.NET 3.5, C #
У меня есть веб-приложение с функцией поиска. Некоторые из доступных для поиска полей являются столбцами первого класса в таблице, но некоторые из них фактически являются вложенными полями внутри типа данных XML.
Ранее я построил систему для динамического построения SQL для моего поиска. У меня была хорошая иерархия классов, которая строила выражения SQL и условные операторы. Единственная проблема заключалась в том, что он не был защищен от атак SQL-инъекций.
Я читал Отличная статья Роба Конери , в которой указывалось, что несколько запросов могут объединяться в один запрос TSQL для сервера, если результат IQueryable никогда не перечисляется. Это заставило меня задуматься о том, что моя конструкция динамического поиска была слишком сложной - мне просто нужно было объединить несколько выражений LINQ.
Например (надумано):
Author:
ID (int),
LastName (varchar(32)),
FirstName (varchar(32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
Результаты в следующем запросе:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
Я понял, что это может быть идеальным решением для генерации простых динамических запросов, защищенных от SQL-инъекций - я просто зациклился на своем результате IQueryable и выполнил дополнительные условные выражения, чтобы получить мое окончательное выражение для одного выполнения.
Однако я не могу найти никакой поддержки для оценки данных XML. В TSQL, чтобы получить значение из узла XML, мы бы сделали что-то вроде
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
Но я не могу найти эквивалент LINQ to SQL для создания этой оценки. Один существует? Я знаю, что могу оценить все стороны БД, не относящиеся к условиям XML, а затем выполнить код кода для оценки XML, но мои данные достаточно велики, чтобы А) это много сетевого трафика, чтобы снизить производительность, и Б) исключений памяти, если я не могу оценить первую сторону БД XML для исключения определенных наборов результатов.
Идеи? Предложения?
Бонусный вопрос - Если оценка XML действительно возможна на стороне БД, как насчет поддержки FLWOR?