2012-09-17 52 views
1

構建我的應用程序時,我困在一個愚蠢的步驟中。Linq 2 SQL和自定義擴展方法

我對LINQ 2 SQL的簡單查詢:

var recipients = cdc.Recipients.Where(r => r.Owner == Sanitize.SanitizeUserName(context.User.Identity.Name) && r.Enabled == true && (r.DisplayName.Contains(qs) || r.EmailAddress.Contains(qs))) 
             .Select(r => new NVC { name = r.DisplayName, value = r.EmailAddress }).ToList(); 

內搭到收件人的表中的一些數據,並放在一個自定義類。這裏一切順利。

我需要在where子句中添加一個額外的過濾器來檢查電子郵件地址是否有效。

我嘗試了一個簡單的函數,但它在使用它時拋出了「no sql translation」異常。

挖通我發現,我必須使用擴展方法,所以我最終建立這個interwebs:

public static Expression<Func<string, bool>> IsSaneEmail = y => (!string.IsNullOrEmpty(y) && Regex.IsMatch(y, emailPattern)); 

(其中emailPattern是一個正則表達式的字符串)

但如何應用到我的查詢?我試圖在沒有運氣的where子句

... && IsSaneEmail(r.emailAddress) && ... 

... && r.EmailAddress.IsSaneEmail() && ... 

補充。

我知道我是愚蠢的,但幫我

回答

0

你的擴展方法需要針對串類,它應該是返回BOOL:

public static bool IsSaneEmail(this string val) { 
     return !string.IsNullOrEmpty(val) && Regex.IsMatch(val, emailPattern) 
    } 

一旦進行排序,你就可以調用此方法,如:

r.EmailAddress.IsSaneEmail() 
+0

不,還是一樣的「沒有sql翻譯」異常。 – Valerio

+0

在這種情況下,我想你需要使用例如ToList()然後過濾它... – silvo

+0

是的,這是一個想法,但大集合呢?這將是無效的 – Valerio

1

你不能做到這一點在LINQ2SQL(不能轉換成SQL),您必須首先轉換爲IEnumerable的。

+0

聽起來很不錯。我會尋找一個例子 – Valerio