LINQ to SQL通配符

mca*_*s20 3 c# lambda wildcard linq-to-sql

如何在LINQ To SQL lambda表达式中构建通配符?

这就是我目前所拥有的:

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));
}
Run Code Online (Sandbox Code Playgroud)

这很好用,直到我尝试在过滤器字符串中传递通配符.我正在试验SqlMethods.Like()但无济于事.

上面的过滤器如下所示:"<key>NID</key><value>mcass</value>".

我希望能够通过这样的过滤器: "<key>NID</key><value>%m%</value>"

Tho*_*rin 8

String.Contains实际上是作为LIKELINQ to SQL中的表达式实现的,因此这些查询是等效的:

query = query.Where(Log => Log.FormattedMessage.Contains("m"));
query = query.Where(Log => SqlMethods.Like(Log.FormattedMessage, "%m%"));
Run Code Online (Sandbox Code Playgroud)

但是,SqlMethods.Like您可以指定更复杂的模式,例如"%m%a%".对我来说很好.您无法真正看到visual studio内部的差异,因为要匹配的表达式放在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%'
Run Code Online (Sandbox Code Playgroud)

不相关的问题本身,而是String.StartsWithString.EndsWidth也翻译为SQL LIKE,当然是有稍微不同的模式.