LINQ to SQL Wildcards

有些话、适合烂在心里 提交于 2019-12-21 05:51:04

问题


How can I build in wildcards to my LINQ To SQL lambda expression?

This is what I have currently:

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));
}

This works fine up until I try and pass wildcards in the filter string. I'm experimenting with SqlMethods.Like() but to no avail.

The filters above look like this: "<key>NID</key><value>mcass</value>".

I'd like to be able to pass filters like this: "<key>NID</key><value>%m%</value>"


回答1:


String.Contains is actually implemented as a LIKE expression in LINQ to SQL, so these queries would be equivalent:

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

However, with SqlMethods.Like, you can specify more complex patterns, such as "%m%a%". Works fine for me. You can't really see the difference from inside visual studio, because the expression to be matched against is put inside a parameter in the T-SQL.

If you were to log the SQL query in a profiler, it would look something like this:

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%'

Not relevant to the question per se, but String.StartsWith and String.EndsWidth also translate to a SQL LIKE, with slightly different patterns of course.




回答2:


The wildcard is such as, m*, so anything with an m, for the wildcard you can ask if it .Contains(m); and it will get anything containing 'm'.

If you need wildcard in the sense of ALL the results from that table, just use

query.ToList(); 

You now have the entire list of Logs.

Hope that helps.



来源:https://stackoverflow.com/questions/3000153/linq-to-sql-wildcards

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!