Как бы я написал это в LINQ2SQL? - PullRequest
2 голосов
/ 07 июля 2010

Я медленно портирую через приложение из MySQL для использования Linq2Sql - но один запрос несколько озадачил меня.

SELECT * FROM Pages, ГДЕ DomainID = @reportid И (PageContent REGEXP 'отображать:[\ t] * none ')> 0 ORDER BY URL ASC

Есть идеи о том, как написать что-то подобное с Linq2SQL?Это бит REGEXP, который поставил меня в тупик?

Ответы [ 2 ]

5 голосов
/ 07 июля 2010

В LINQ to SQL нет встроенного способа, но у вас есть несколько других вариантов. Во-первых, загружает ваши строки как объекты в памяти, к которым вы можете применять функции Regex . Я не большой поклонник этого, так как похоже, что у вас могут быть очень большие строки для сравнения.

Второй вариант - использовать SQL CLR , как описано здесь . Это эффективно позволяет вам создать хранимую процедуру, которая будет связана с созданным вами методом CLR. Каждый раз, когда вы вызываете метод в контексте LINQ to SQL, он преобразуется в вызов хранимой процедуры. Затем вы используете запрос, подобный этому:

var q = from p in context.Pages
        where p.DomainId == reportId && 
              RegExMatch(p.PageContent, "display\:[ \t]*none")
        select p;
1 голос
/ 07 июля 2010

Почему бы не использовать LINQ для возврата элементов, которые совпадают в reportid и содержат 'display:', чтобы минимизировать объем данных, возвращаемых с сервера, а затем использовать регулярные выражения на стороне клиента для фильтрации этого списка?

var query = Pages.Where( p => p.DomainId == 1 && p.PageContent.IndexOf("display:") > 0).OrderBy( o => o.URL );

var regex = new Regex(@"display\:[\t]*none");

foreach (var page in query)
{
    if( regex.IsMatch(page.PageContent) )
    {
        // Do whatever...                    
    }                    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...