2012-07-16 38 views
1

語境LINQ查詢結果

我檢索站點的列表從數據庫這樣的:與字符串操作和正則表達式

DashboardEntities dashboardDB = new DashboardEntities(); 

var sites = dashboardDB.Instances 
    .Select(attr => new SiteModel 
     { 
      server = attr.server, 
      pool = attr.pool, 
      url = attr.url, 
      version = attr.version, 
      client = ??? 
     }) 
    .ToList(); 

return sites; 

對於client,我需要從這樣的URL字符串:

String client = ""; 

Regex rgx = new Regex(@"\.[a-z-./]+"); 
client = rgx.Replace(attr.url, ""); 

rgx = new Regex("formation-"); 
client = rgx.Replace(client, ""); 

問題

如何做到這一點的字符串操作無線th正則表達式到我的LINQ查詢?

+0

的一種方法是將其設置爲attr.url,然後迭代後的列表LINQ做必要的替換? – ColWhi 2012-07-16 15:21:01

回答

2

根據Guffa和RePierre:

DashboardEntities dashboardDB = new DashboardEntities(); 

var sites = dashboardDB.Instances 
    .Select(attr => new SiteModel 
     { 
      url = attr.url, 
      server = attr.server, 
      pool = attr.pool, 
      version = attr.version, 
      client = attr.url 
     }) 
    .ToList(); 

sites.ForEach(attr => attr.client = Regex.Replace(attr.client, @"\.[a-z-./]+", "").Replace("formation-", "")); 
1

你不能以目前的形式擁有它。對於正則表達式部分,不會有SQL的已知轉換。但是,一旦調用.ToList(),您可以將其添加爲隨後的選擇。

... .ToList() 
     .Select(
      z => z.client = new Regex(@"\.[a-z-./]+") 
       .Replace(z.attr.url, "").Replace("formation-", "") 
    ) 

將其視爲僞代碼,但該通用方法應該能夠完成。那麼你只需要在初始選擇中設置client = ""

編輯:作爲一個方面說明,「形成」一塊真的不需要是正則表達式。一個簡單的字符串替換應該足夠了,並且會更快。

1

不幸的是,您將無法將正則表達式處理邏輯直接發送到數據庫;您需要從數據庫獲取url,然後遍歷列表以從url獲取客戶端數據。

DashboardEntities dashboardDB = new DashboardEntities(); 
var sites = dashboardDB.Instances 
    .Select(attr => new SiteModel 
    { 
     server = attr.server, 
     pool = attr.pool, 
     url = attr.url, 
     version = attr.version, 
     client = attr.url // load the url for further processing 
    }) 
    .ToList(); 
// iterate over the list and get client data from the url 
sites.ForEach(ite => item.client = GetSubstring(item.client)); 
return sites; 

其中方法GetSubstring封裝了正則表達式處理邏輯。

private string GetSubstring(string url) 
{ 
    String client = "";   
    Regex rgx = new Regex(@"\.[a-z-./]+");   
    client = rgx.Replace(attr.url, "");   
    rgx = new Regex("formation-");   
    client = rgx.Replace(client, ""); 
    return client; 
} 
+0

太好了,謝謝! – 2012-07-17 12:03:45

1

可能有更好的方法,但什麼:

Regex rgx1 = new Regex(@"\.[a-z-./]+"); 
Regex rgx2 = new Regex("formation-"); 

DashboardEntities dashboardDB = new DashboardEntities(); 

var sites = dashboardDB.Instances 
    .Select(attr => new SiteModel 
     { 
      server = attr.server, 
      pool = attr.pool, 
      url = attr.url, 
      version = attr.version, 
      client = rgx2.Replace(rgx1.Replace(attr.url,""),"") 
     }) 
    .ToList(); 

return sites; 
+0

不錯,謝謝! :) – 2012-07-16 15:36:20

1

你甚至都不需要第二個正則表達式替換。你可以做到這一點與靜態超載一個表達式:

client = Regex.replace(attr.url, @"\.[a-z-./]+", "").Replace("formation-", "") 
+0

太好了,謝謝! – 2012-07-16 15:35:43