Я намеревался предоставить своему представлению / бизнес-уровню возможность отправлять HQL-запросы в виде строк на мой уровень данных.
Однако уровень данных должен анализировать эти запросы и манипулировать ими (в частности, добавитькритерий в предложении where).
Поддерживаемые формы запросов HQL представляют собой любую комбинацию из следующего:
from ...
where ...
order by ...
Я думаю, что этот вид упрощенного запроса HQL должен поддерживать регулярные выражения, иэто Regex, который я определил:
public const string HqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+)\s*)?"
+ @"(\bwhere\b\s*(?<WherePart>.+)\s*)?"
+ @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+))?$";
Regex re = new Regex(Novartis.MapAdmeBs.NHibernateDAO.DAOFactory.HqlRegex,
RegexOptions.Singleline);
Обновление: Я даже пытался с модификатором non-жадный:
public const string HqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+?)\s*)?"
+ @"(\bwhere\b\s*(?<WherePart>.+?)\s*)?"
+ @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+?))?$";
Однако, когда я пытаюсьдля сопоставления строки, содержащей где и предложение order by, ключевое слово order by рассматривается как часть предложения where:
Match m = re.Match("where (e.Name not like '%X') and e.StatusID not in (7, 8, 9)"
+ " order by e.DateCreated desc");
Console.WriteLine(m.Groups["WherePart"].Value);
дает
(e.Name не похож на '% X') и e.StatusID не в (7, 8, 9) порядке по e.DateCreated desc
Любая из следующих справок приветствуется:
- Как исправить регулярное выражение?
- Существует ли регулярное выражение для HQL?(Поиск в Google приводит к regexp-функциям языка HQL)
- Лучшая идея, которую все еще достаточно просто реализовать за день или меньше?