2016-10-02 2 views
0

Мне нужно запросить таблицы в старой базе данных с сервера веб-API (C#), который использует ODATA. У меня есть базовый драйвер ODBC для устаревшей базы данных, и мне нужно поддерживать базовую фильтрацию в это время (eq, startswith и substringof). Например:

queryOptions.Filter.RawValue:

((startswith(Name,'Bill')) and 
(substringof('sunset',Address)) and 
(substringof('7421',Phone))) 

должны быть преобразованы в нечто вроде этого (я озабочен только с ИНЕКЕ здесь):

SELECT CustName, Address1, Address2, ... 
FROM Customers 
WHERE CustName like 'Bill%' AND 
    Address1 like '%sunset% AND 
    Phone like '%7421%' 

Я понимаю, что синтаксический RawValue, вероятно, не очень хорошая идея.

У кого-нибудь есть что-то подобное уже написанное, которое я могу использовать в качестве отправной точки? Или советы по хорошему, надежному способу выполнения этого?

+0

Смотрите мой ответ в этой теме. http://stackoverflow.com/a/36956462/3271357 – PvPlatten

+0

Я также разместил альтернативу по адресу http://stackoverflow.com/questions/28372999/translate-odata-queries-to-sql/42547175#42547175 –

ответ

0

Вам нужно будет применить некоторое регулярное выражение к необработанному значению, получить совпадения и применить некоторую логику для преобразования. В принципе, выполните поиск функций с параметрами, удалите текст функции, получите параметры и преобразуйте их в похожие предложения. Что-то вроде этого:

string str = @"((startswith(Name,'Bill')) and 
(substringof('sunset',Address)) and 
(substringof('7421',Phone)))"; 

System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"startswith\(([^\)]+)\)"); 

System.Text.RegularExpressions.Match match = regex.Match(str); 

if (match.Success) 
{ 
    string tmp = match.Value; 
    string destination = "@field LIKE '@val%'"; 

    tmp = tmp.Replace("startswith(",""); 
    tmp = tmp.Replace(")",""); 

    string[] keyvalue = tmp.Split(','); 
    string field = keyvalue[0]; 
    string val = keyvalue[1]; 

    destination = destination.Replace("@field", field); 
    destination = destination.Replace("@val", val.Replace("'","")); 
    Console.WriteLine(destination); 
} 

Этот выход:

Name LIKE 'Bill%' 
+0

@ epsino316 Спасибо, но синтаксический анализ необработанного значения с использованием reg ex, вероятно, будет немного хрупким (фильтр запросов ODATA основан на том, что пользователи вводят в пользовательский интерфейс, включая символы, которые будут разорвать регулярное выражение, если не сбежать, и т. д.). Я надеялся найти более надежный подход (без необходимости писать собственный поставщик запросов). – Lars335

+0

Ни о чем не думать. Возможно, это инструмент коммерческого преобразования, или посмотрите проект с открытым исходным кодом в github. – espino316

 Смежные вопросы

  • Нет связанных вопросов^_^