1

環境

次のように、データベースからサイトのリストを取得します。

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, "");

質問

正規表現を使用したこの文字列操作を LINQ クエリにどのように適用しますか?

4

5 に答える 5

2

2番目の置換には正規表現も必要ありません。静的オーバーロードを使用して、単一の式として実行できます。

client = Regex.replace(attr.url, @"\.[a-z-./]+", "").Replace("formation-", "")
于 2012-07-16T15:27:34.003 に答える
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-", ""));
于 2012-07-17T12:03:19.540 に答える
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;
于 2012-07-16T15:27:01.723 に答える
1

あなたが持っている現在の形ではできません。正規表現部分の SQL への既知の変換はありません。.ToList()ただし、が呼び出されたら、後続の選択として追加できます。

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

それを疑似コードとして扱いますが、その一般的なアプローチでそれを実行できるはずです。client = ""次に、最初の選択で設定するだけです。

編集:補足として、「形成」部分は実際には正規表現である必要はありません。単純な文字列の置換で十分であり、高速になります。

于 2012-07-16T15:24:47.990 に答える
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;
}
于 2012-07-16T15:25:36.280 に答える