2016-01-06 93 views
-2

我有串逗號分隔的電子郵件列表如何使用LINQ檢查字符串屬性包含任何字符串列表中的集合

var emails="[email protected],[email protected],[email protected],[email protected],[email protected],"; 
var list=new List<string>(); 
list.Add("[email protected]"); 
list.Add("[email protected]"); 

我怎麼能寫玲查詢,以找出是否字符串(電子郵件)有任何電子郵件地址匹配 收集(列表)。

我使用EF和電子郵件字符串屬於一個類和列表是獨立的集合。

+0

你是說'emails'實際上是你用EF查詢實體的屬性? – juharr

+0

是@juharr電子郵件是一個實體的財產 – pawanplus

+0

那麼你真的應該考慮不要在你的數據庫中存儲逗號分隔列表作爲一個字符串,而是建立一個適當的一對多關係。 – juharr

回答

1
刪除重複 並比較stringg區分大小寫的,而無需創建新的字符串

該解決方案使用linq。由於您的電子郵件地址以逗號分隔(並以逗號結尾),因此我們可以檢查列表中項目的Any()是否包含在電子郵件字符串中。我使用ToLower()使其不區分大小寫(通常是哪些電子郵件地址)。

var hasMatch = list.Any(item => ","+emails.ToLower().Contains(","+item.ToLower()+",")); 
+0

謝謝@Fann這是我能想到的一個解決方案。 – pawanplus

0

你能做到下面的方式

emails.Split(',').Any (y => list.Contains (y)); 
1
emails.Split(',').Any(e=>list.Contains(e)); 

或者:

emails.Split(',').Intersect(list).Any(); 

如果你用它來查找數據庫中的記錄,那麼你可以這樣做:

db.MyTable.Where(l=>list.Any(e=>l.emails.StartsWith(e+",")) || 
list.Any(e=>l.emails.EndsWith(","+e)) || 
list.Any(e=>l.emails.Contains(","+e+",")) || 
list.Any(e=>l.emails==e) 
) 

或者你可以簡化它:

db.MyTable.Where(l=>list.Any(e=>(","+l.emails+",").Contains(","+e+","))) 

第三選項可能有更好的表現,如果你正在尋找的第一個記錄,因爲它可能會使用你的電子郵件的任何索引快速定位記錄,但它會產生一些非常大的SQL語句,如果該列表大(當前的SQL LINQ提供程序的實現不幸將其轉換爲CHARINDEX函數而不是LIKE'email%',但這可能會改變)。

第4個選項將生成更簡單的SQL,並且如果要查找所有匹配的記錄而不僅僅是第一個,則可能會更好。

+0

由於電子郵件列表中的尾部「,」,您將需要'emails.Split(new char [] {',',StringSplitOptions.RemoveEmptyEntries)'。 –

+0

@MatthewWatson只有當你想假定一個空字符串匹配是無效的,我不會做出這個假設。如果你不想匹配一個空字符串,那麼不要在'list'中放置一個空字符串。 –

+0

但'string.Contains(text,「」)'將始終返回true,並且電子郵件列表具有尾部',',所以如果在分割之後不刪除空條目,則結果將爲true,而不管'list'。 –

0
var emailsList = emails.Split(','); 
list.Any(x => emailsList.Contains(x)); 

Antoher方法

HashSet<String> emailSet = New HashSet<String>(temp.Split(",")); 
    list.Any(s => emailSet.Contains(s, StringComparer.Ordinal)); 

使用HashSet的 - Contains工作更快(如果電子郵件字符串可大了),並通過ToLower()

+0

'x ='不會編譯。 –

相關問題