2010-12-09 29 views
1

我的任務是爲我們的搜索添加一個選項,該選項將返回給定字段不是以字母開頭的結果。 (該.StartsWith(字母)部分並不那麼難)。如何查詢字段何時不以字母開頭?

但我很不確定如何獲得不屬於A-Z集合的結果,同樣希望它能夠在下面生成一些中等效率的SQL。

任何幫助表示讚賞 - 謝謝。

回答

3

在C#使用下面的結構,假設分貝作爲數據上下文:

var query = from row in db.SomeTable 
      where !System.Data.Linq.SqlClient.SqlMethods.Like(row.SomeField, "[A-Z]%") 
      select row; 

這在LINQ只支持到SQL的查詢。 T-SQL LIKE運算符的所有規則都適用。

你也可以使用更少的有效的解決方案:

var query = from row in db.SomeTable 
      where row.SomeField[0] < 'A' || row.SomeField[0] > 'Z' 
      select row; 

這被翻譯成子串,CAST和UNICODE構建。

最後,您可以使用VB,其中似乎有一個本地支持Like方法。

0

好了,我不知道這是否會工作,因爲我從來沒有嘗試過,並沒有一個編譯器就近嘗試,但我會嘗試的第一件事是

var query = from x in db.SomeTable 
      where x.SomeField != null && 
        x.SomeField.Length >= 1 && 
        x.SomeField.Substring(0, 1).All(c => !Char.IsLetter(c)) 
      select x; 

的possiblility存在LINQ to SQL無法將其轉換爲SQL。

+0

@Robaticus:感謝您的糾正。 – jason 2010-12-09 14:45:18

+0

您將得到一個異常:System.NotSupportedException:不支持類型爲'System.String'的序列操作符 – Ruslan 2010-12-09 17:47:39

1

儘管SQL提供了使用括號表示法(例如[a-f]%)來檢查LIKE語句中字符範圍的功能,但是我還沒有看到直接支持這個的sql結構的linq。

一對夫婦的想法:

首先,如果結果集比較小,你可以在事後做了.ToList()和過濾器在內存中。

或者,如果您有能力更改數據模型,則可以設置其他字段或表以幫助索引數據並改進搜索。

- EDIT--

根據下面的Ruslan的評論作出更改。

相關問題