2010-06-08 137 views
3

如何在通配符中構建我的LINQ To SQL lambda表達式?LINQ to SQL通配符

這是我目前:

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 2010-06-08 18:36:14

+0

@ Thorarin生成的SQL與.Contains()SQL相同。也許我需要更多地關注嵌入通配符? – mcass20 2010-06-08 18:45:26

+0

只是要清楚,你是否通過'' NID%m%「'到'SqlMethods.Like'並仍然得到與沒有'%'通配符時相同的結果? – 2010-06-08 19:01:16

回答

8

String.Contains實際上被實現爲在LINQ to SQL一個LIKE表達,所以這些查詢是等價的:

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

然而,隨着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%' 

還沒到問題本身有關,但String.StartsWithString.EndsWidth也翻譯爲SQL LIKE,與當然略有不同的模式。

+0

感謝您的輸入。我開始認爲我的問題在於濾鏡本身。如果你看看我的問題的底部,我會提供我正在查詢的字符串。第一個返回記錄。第二,不。如果有幫助,我在查詢一個包含xml的SQL列,與我的過濾器示例類似。 – mcass20 2010-06-08 19:06:24

+0

@ mcass20:這很奇怪。如果第一個過濾器返回一個記錄,則第二個過濾器肯定會返回*最少*一個。如果你有SQL Profiler,它可能有助於弄清楚發生了什麼。 – Thorarin 2010-06-08 19:13:25

+0

如果您沒有SQL事件探查器,當然也可以將'Console.Out'(或另一個TextWriter)附加到'context.Log'。 – Thorarin 2010-06-08 19:24:45

0

的通配符,例如,M *,所以任何與米,這對於通配符,你可以問,如果它。載有(M) ;它會得到任何包含'm'的東西。

如果你在所有從表中的結果的意義需要通配符,只是用

query.ToList(); 

你現在有記錄的完整列表。

希望有所幫助。

+0

如果您需要獲取多個字符串,則可以使用ForEach語句,然後檢查每個字符串並將其與每個字符串綁定到本地列表。 「列出規則=新列表(); VAR日誌=新列表(); Rules.ForEach(規則=> Logs.Add(query.Contains(規則)));」 我相信應該工作! – 2010-06-08 19:08:09