2012-09-06 67 views
0

我正在使用實體框架,並開始使用LINQ編寫查詢。使用子字符串執行linq搜索 - 有沒有更好的方法?

我有一個Store表,其中每個商店都有一個名稱字段。我想要做的搜索之一是通過首字母,我試圖找到實現它的最佳方式。我最好的意思是最有效的。

大多數搜索只查找一個鍵'A','B','C'等,但其中一個搜索不同,因爲組'0-9'將包含一個鍵列表,一個用於0 ,1個等等。所以我的出發點是某種類型的列表。

然後我需要說明Store名稱是否以列表中的任何鍵開始,因爲Store不在表中存儲首字母。

我正在尋找幫助的兩件事。首先,我已經概述瞭如何讓linq工作。其次,對於是否有最好的/唯一的方法來回收數據或者是否有更好的方法提出任何建議。

回答

6

你的問題不是很清楚,但是根據我的理解,你要搜索以密鑰列表中的密鑰開頭的商店。你可以做到這一點是這樣的:

List<string> keys = new List<string>() { "A", "B", "M" }; 
var result = stores.Where(store => keys.Any(key => store.Name.StartsWith(key)); 
+0

感謝您的幫助。 – dotnetnoob

1

如果查詢可以不同,那麼對於字母:

stores.Where(s=>s.Name.First == c); 

而對於數字:

stores.Where(char.IsDigit); 

如果他們必須是相同的,那麼我建議一個字符範圍:

stores.Where(s=> c1 <= s.Name.First && s.Name.First <= c2) 

如果你願意,可以代表由元組範圍:

Tuple<char, char> range = Tuple.Create('A', 'A'); 
//Tuple<char, char> range = Tuple.Create('0', '9'); 
stores.Where(s=> range.Item1 <= s.Name.First && s.Name.First <= range.Item2) 

編輯:在實體使用功能框架

Tuple<char, char> range = Tuple.Create('A', 'A'); 
//Tuple<char, char> range = Tuple.Create('0', '9'); 
stores.Where(s=> range.Item1 <= s.Name.Substring(0, 1) && s.Name.Substring(0, 1) <= range.Item2) 
+1

實體框架不支持在表達式中使用First()。它會拋出運行時異常(完成代碼編譯後)。 – Slauma

+0

有趣。而是使用索引或其中一個EF擴展。解決方案的基本形式應該起作用。 –

+0

@Slauma - 是的,我很努力地找到一個給出'between'函數的語法 - string [0]不起作用,如果轉換爲字符串,我可以使用tuple方法上面的列表方法可以工作,但它會對錶格做出更改,所以我會避免這種情況,除非必要。有任何想法嗎? – dotnetnoob

相關問題