2015-01-27 2 views
0

Я пытаюсь реализовать поиск подстановочных знаков Функция (*,?) С использованием LINQ to SQL. На данный момент я хочу попробовать его с помощью регулярного выражения, поскольку код, который мы пишем, будет коротким и легко управляемым. Вот что у меня естьРегулярное выражение с использованием выражений Lambda

string kw=_keyword.Replace("*",".*").Replace("?","."); 
     var predicate = PredicateBuilder.True<DAL.RequestAttribute>(); 
     Regex reg=new Regex("^"+kw+"$"); 
     predicate=predicate &&(reg.IsMatch(ra=>ra.AttributeValue)); 

Итак, здесь он дает ошибку компиляции, как «Не удается преобразовать лямбда-выражения к типу„строка“, потому что это не тип делегата»

Хотя некоторые обходные пути, если я это сделать компилировать и запускать, я получаю эту ошибку времени выполнения

«Метод Boolean IsMatch (System.String)» не поддерживает перевод на SQL ».

Итак, у меня есть два вопроса здесь 1. Думаю ли я в правой полосе, чтобы реализовать свой шаблон, используя регулярные выражения? если нет, то это более эффективный способ сделать это? 2. Как устранить эту ошибку.

Благодаря

ответ

0

Вы могли бы имитируют LIKE оператора SQL путем использования SqlMethods.Like: https://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like%28v=vs.110%29.aspx.

Просто не забудьте использовать соответствующие подстановочные знаки/маркеры: https://msdn.microsoft.com/en-us/library/ms179859.aspx.

Обновление: Вы не можете использовать регулярные выражения с простым SQL. Так как вы по существу строят инструкцию SQL через LINQ, применяется одно и то же правило. Хотя, все еще не совсем понятно, где вы используете LINQ с образцом кода, который вы предоставили.

я обычно ожидают увидеть что-то вроде следующего:

var results = 
    from Something in SomeLinqContext 
    where SqlMethods.Like(Something.Value, kw); 
+0

Подобный метод SQL также не работает, поскольку первая ошибка появляется снова. Вот мой код. Я попробовал строку kw = _keyword.Replace («*», «%»). Замените («?», «_»); var predicate = PredicateBuilder.True (); Regex reg = new Regex ("^" + kw + "$"); predicate = predicate && (System.Data.Linq.SqlClient.SqlMethods.Like ((ra => ra.AttributeValue), kw)); Я получаю ошибку в последней строке, как указано. –

+0

Обновление моего ответа, чтобы прояснить что-то. – ventaur

+0

В более ручной обработке я получил следующий код для строки «*» [] _searchParts = _keyword.Split ('*'); , если (_searchParts.Length == 2) { , если (string.IsNullOrEmpty (_searchParts [0])) { , если (_fieldName == NULL) предикатные = (га => ra.AttributeValue.EndsWith (_searchParts [ 1]) && ra.Attribute.LibID == _libID); else predicate = (ra => ra.AttributeValue.EndsWith (_searchParts [1]) && ra.Attribute.LibID == _libID && ra.Attribute.Name == _fieldName); } Это работает Хорошо, и я использую класс Predicatebuilder на странице http: //www.albahari.com/expressions " –

0

После некоторых исследований я нашел ответ на мой вопрос. Благодаря Ventaur для предложения. решение аналогично, но немного другое. PFB код для него

string kw=_keyword.Replace("*","%").Replace("?","_"); 
var predicate = PredicateBuilder.True<DAL.RequestAttribute>(); 
predicate = (ra => SqlMethods.Like(ra.AttributeValue, kw) && <Any other boolean conditions> 

Поэтому она сводится к тому, как сделать выражение из метода SQLMethods.like с помощью нашего класса предикат строитель.