2010-06-08 3 views
3

Как я могу создать подстановочные знаки для выражения LINQ To SQL lambda?LINQ to SQL Wildcards

Это то, что я в настоящее время:

var query = from log in context.Logs select log; 
foreach (string filter in CustomReport.ExtColsToFilter) 
{ 
    string tempFilter = filter; 
    query = query.Where(Log => Log.FormattedMessage.Contains(tempFilter)); 
} 

Это прекрасно работает, пока я не попытаться передать символы в строке фильтра. Я экспериментирую с SqlMethods.Like(), но безрезультатно.

Фильтры выше выглядят так: "<key>NID</key><value>mcass</value>".

Я хотел бы быть в состоянии пройти фильтры, как это: "<key>NID</key><value>%m%</value>"

+1

'SqlMethods.Like' должен работать. Каков результат при попытке? – Thorarin

+0

@Thorarin. Полученный SQL-код совпадает с SQL-кодом .Contains(). Может быть, мне нужно больше сосредоточиться на встраивании подстановочных знаков? – mcass20

+0

только для того, чтобы быть понятным, вы проходите в '' NID% m% "' to 'SqlMethods.Like' и по-прежнему получать тот же результат, что и вы, без' '' подстановочных знаков? –

ответ

8

String.Contains фактически реализован в виде LIKE выражения в LINQ к SQL, так что эти запросы будут эквивалентны:

query = query.Where(Log => Log.FormattedMessage.Contains("m")); 
query = query.Where(Log => SqlMethods.Like(Log.FormattedMessage, "%m%")); 

Однако, с SqlMethods.Like, вы можете указать более сложные модели, такие как "%m%a%". Прекрасно работает для меня. Вы не можете увидеть разницу внутри визуальной студии, потому что выражение, которое должно быть сопоставлено, помещается внутри параметра в T-SQL.

Если вы должны были войти в запрос SQL в профайлер, это будет выглядеть примерно так:

exec sp_executesql N'SELECT [t0].[ID], [t0].[FormattedMessage] 
FROM [dbo].[Log] AS [t0] 
WHERE [t0].[FormattedMessage] LIKE @p0',N'@p0 nvarchar(5)',@p0=N'%m%a%' 

Не относится к вопросу по существу, но String.StartsWith и String.EndsWidth также перевод на SQL LIKE, с конечно, несколько разных моделей.

+0

Спасибо за ваш вклад. Я начинаю думать, что моя проблема заключается в самих фильтрах.Если вы посмотрите на мой вопрос, я даю строки, которые я запрашиваю. Первый возвращает запись. Второе - нет. Если это помогает, я запрашиваю столбец SQL, содержащий xml, похожий на мои примеры фильтров. – mcass20

+0

@ mcass20: Это очень странно. Если первый фильтр возвращает запись, второй фильтр должен обязательно вернуться к * наименьшему * одному. Если у вас есть SQL Profiler, это может помочь выяснить, что происходит. – Thorarin

+0

Если у вас нет SQL Profiler, добавление 'Console.Out' (или другого TextWriter) в' context.Log' также будет работать, конечно. – Thorarin

0

Подстановочный является такими как, м *, так ничего с м, для шаблона вы можете спросить, .Contains (м) ; и он получит что-нибудь, содержащее «m».

Если вам нужно подстановочные в том смысле, все результаты из этой таблицы, просто используйте

query.ToList(); 

Теперь у вас есть полный список журналов.

Надеюсь, что это поможет.

+0

, если вам нужно получить несколько строк, вы можете использовать оператор ForEach и проверять каждую строку и привязывать ее к локальному списку с каждой строкой. "Список Правила = новый Список (); вар пиловочник = новый список (); Rules.ForEach (правило => Logs.Add (query.Contains (правило)));" Я считаю, что это должно сработать! –