2014-04-15 50 views
0

我有兩個存儲電話號碼的數據庫。第一個以15555555555(美國數字)格式存儲國家代碼,另一個可以以多種不同格式存儲它們(例如(555)555-5555,555555555,555-555-5555,555-5555等)。當電話號碼取消訂閱一個數據庫時,我需要取消訂閱其他數據庫中的所有對其的引用。使用正則表達式比較電話號碼的最佳方法

在第二個數據庫中找到與第一個數據庫中的號碼相匹配的電話號碼的所有實例的最佳方法是什麼?我正在使用實體框架。我的代碼現在看起來是這樣的:

using (FusionEntities db = new FusionEntities()) 
    { 

      var communications = db.Communications.Where(x => x.ValueType == 105); 

      foreach (var com in communications) 
      { 
       string sRegexCompare = Regex.Replace(com.Value, "[^0-9]", ""); 
       if (sMobileNumber.Contains(sRegexCompare) && sRegexCompare.Length > 6) 
       { 
        var contact = db.Contacts.Where(x => x.ContactID == com.ContactID).FirstOrDefault(); 
        contact.SMSOptOutDate = DateTime.Now; 
       } 
      } 
    } 

現在,我比較會檢查是否第一數據庫包含從第二數據庫中至少有7個數字的所有非數字字符被刪除了。

理想情況下,我希望能夠將正則表達式格式應用到代碼中從數據庫獲取數據的位置。起初,我想這一點,但我不能在LINQ查詢中使用替代:

var communications = db.Communications.Where(x => x.ValueType == 105 && sMobileNumber.Contains(Regex.Replace(x.Value, "[^0-9]", "")));

+1

你可以看看這個[答](http://stackoverflow.com/a/123681)。 – HamZa

+1

這很有幫助。在這一點上,我並沒有多少尋找最好的表達方式,而是像過濾它的最佳方式那樣。那有意義嗎? – ijb109

+0

每個數字都有規範表示嗎? (在任何情況下,我的第一本能是使用計算列。) – user2864740

回答

1

比較的電話號碼是有點超出設計正則表達式的能力。正如你發現有很多方法可以表示電話號碼,不管區號和格式如何。正則表達式用於模式匹配,所以你發現使用正則表達式去除所有格式,然後比較字符串是可行的,但將邏輯放入正則表達式中,這不是它的用途。

我會建議做的第一件也是最重要的事情是理清電話號碼的表示形式。由於您有數據庫訪問權限,因此您可能想要創建一個新字段或表來表示電話號碼對象。然後把你的比較邏輯放在模型中。

是的,這是更多的工作,但它使代碼更容易理解,並幫助清理垃圾數據。