我的任務是爲我們的搜索添加一個選項,該選項將返回給定字段不是以字母開頭的結果。 (該.StartsWith(字母)部分並不那麼難)。如何查詢字段何時不以字母開頭?
但我很不確定如何獲得不屬於A-Z集合的結果,同樣希望它能夠在下面生成一些中等效率的SQL。
任何幫助表示讚賞 - 謝謝。
我的任務是爲我們的搜索添加一個選項,該選項將返回給定字段不是以字母開頭的結果。 (該.StartsWith(字母)部分並不那麼難)。如何查詢字段何時不以字母開頭?
但我很不確定如何獲得不屬於A-Z集合的結果,同樣希望它能夠在下面生成一些中等效率的SQL。
任何幫助表示讚賞 - 謝謝。
在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方法。
好了,我不知道這是否會工作,因爲我從來沒有嘗試過,並沒有一個編譯器就近嘗試,但我會嘗試的第一件事是
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。
儘管SQL提供了使用括號表示法(例如[a-f]%
)來檢查LIKE語句中字符範圍的功能,但是我還沒有看到直接支持這個的sql結構的linq。
一對夫婦的想法:
首先,如果結果集比較小,你可以在事後做了.ToList()
和過濾器在內存中。
或者,如果您有能力更改數據模型,則可以設置其他字段或表以幫助索引數據並改進搜索。
- EDIT--
根據下面的Ruslan的評論作出更改。
@Robaticus:感謝您的糾正。 – jason 2010-12-09 14:45:18
您將得到一個異常:System.NotSupportedException:不支持類型爲'System.String'的序列操作符 – Ruslan 2010-12-09 17:47:39