C# LINQ到SQL通配符

C# LINQ到SQL通配符,c#,linq-to-sql,lambda,wildcard,C#,Linq To Sql,Lambda,Wildcard,如何在LINQ到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(tempFilt

如何在LINQ到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));
}
在我尝试在筛选器字符串中传递通配符之前,这一切都很正常。我正在试验
SqlMethods.Like()
,但没有效果

上面的过滤器如下所示:
“NIDmcass”


我希望能够通过这样的过滤器:
“NID%m%”

通配符是如m*,因此任何带有m的内容,对于通配符,您可以询问它是否包含(m);它会得到任何包含“m”的东西

如果需要该表中所有结果的通配符,只需使用

query.ToList(); 
现在您拥有了完整的日志列表


希望对您有所帮助。

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

query = query.Where(Log => Log.FormattedMessage.Contains("m"));
query = query.Where(Log => SqlMethods.Like(Log.FormattedMessage, "%m%"));
但是,使用
SqlMethods.Like
,您可以指定更复杂的模式,例如
“%m%a%”
。对我来说很好。从VisualStudio内部看不到真正的区别,因为要匹配的表达式放在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的
,当然模式略有不同。

SqlMethods.LIKE
应该可以工作。尝试时的结果是什么?@Thorarin生成的SQL与.Contains()SQL相同。也许我需要更多地关注嵌入通配符?只是想澄清一下,您是否将
“NID%m%”
传递给
SqlMethods。像
一样,仍然得到与没有
%
通配符时相同的结果?@Ahmad实际上,不是。当我将您提到的字符串传递给SqlMethods.Like()方法时,SQL输出是这样的:WHERE([t0][FormattedMessage]像@p0 ESCAPE'~”)…很有趣…你知道你的具体案例中发生了什么吗?谢谢你的输入。我开始认为我的问题在于过滤器本身。如果你看一下我问题的底部,我会给出我要查询的字符串。第一个返回一条记录。第二个,没有。如果有帮助的话,我正在查询一个包含xml的SQL列,类似于我的过滤器示例。@mcass20:这很奇怪。如果第一个过滤器返回一条记录,那么第二个过滤器肯定会返回至少一条记录。如果您有SQL Profiler,它可能有助于了解发生了什么。如果您没有SQL Profiler,请将
控制台.out
(或另一个TextWriter)附加到
上下文。当然,日志
也可以工作。SQL输出看起来应该是这样的,我已将其缩小到字符串本身。“%m%”返回记录,但“NID%m%”不返回。正如您所建议的,我还尝试了“%NID%m%%”…运气不好。如果需要获取多个字符串,可以使用ForEach语句,检查每个字符串并将其固定到每个字符串的本地列表中。“List Rules=new List();var Logs=new List();Rules.ForEach(rule=>Logs.Add(query.Contains(rule));”我相信这应该行得通!