2010-07-07 141 views
2

我正在從MySQL緩慢移植一個應用程序來使用Linq2Sql - 但有一個查詢讓我難住了一下。如何在LINQ2SQL中編寫此代碼?

SELECT * FROM網頁,域ID = @reportid AND(PageContent REGEXP '顯示:[\ t] *無')> 0 ORDER BY URL ASC

上我會怎麼寫的東西任何想法像Linq2SQL一樣?它的REGEXP位讓我難住?

+0

所以,如果我理解正確的話,它在尋找不包含「隱藏」內容的頁面(即沒有在頁面上寫着'顯示:none',與之間的「零個或多個空格或製表符: '和'none'? – StriplingWarrior 2010-07-07 17:13:43

回答

1

爲什麼不使用LINQ返回匹配reportid是和包含的項目「顯示:」,以儘量減少從服務器返回的數據量,然後用正則表達式在客戶端過濾該列表?

var query = Pages.Where(p => p.DomainId == 1 && p.PageContent.IndexOf("display:") > 0).OrderBy(o => o.URL); 

var regex = new Regex(@"display\:[\t]*none"); 

foreach (var page in query) 
{ 
    if(regex.IsMatch(page.PageContent)) 
    { 
     // Do whatever...      
    }      
} 
5

有沒有辦法內置到LINQ to SQL,但你有幾個其他的選擇。首先是load your strings in as in-memory objects which you can apply Regex functions to。我不是很喜歡這個,因爲它看起來像你可能會得到一些非常大的字符串來匹配。

第二個選項是利用SQL CLR as described here。這實際上可以讓你創建一個存儲過程,並鏈接到你創建的CLR方法。無論何時在LINQ to SQL上下文中調用該方法,它都會轉換爲存儲過程調用。然後你使用這樣的查詢:

var q = from p in context.Pages 
     where p.DomainId == reportId && 
       RegExMatch(p.PageContent, "display\:[ \t]*none") 
     select p; 
+1

+1,如果需要正則表達式部分,那麼CLR存儲過程可能是要走的路。 – kprobst 2010-07-07 17:35:22