您可以通過添加一個方法爲DataContext的一個局部類利用ISNUMERIC
功能。這與使用UDF類似。
在你的DataContext的部分類補充一點:
partial class MyDataContext
{
[Function(Name = "ISNUMERIC", IsComposable = true)]
public int IsNumeric(string input)
{
throw new NotImplementedException(); // this won't get called
}
}
那麼你的代碼將使用它以這種方式:
var query = dc.TableName
.Select(p => new { p.Col, ReplacedText = p.Col.Replace("EU", "") })
.Where(p => SqlMethods.Like(p.Col, "EU%")
&& dc.IsNumeric(p.ReplacedText) == 1)
.OrderByDescending(p => p.ReplacedText)
.First()
.Col;
Console.WriteLine(query);
或者你可以使用MAX:
var query = dc.TableName
.Select(p => new { p.Col, ReplacedText = p.Col.Replace("EU", "") })
.Where(p => SqlMethods.Like(p.Col, "EU%")
&& dc.IsNumeric(p.ReplacedText) == 1);
var result = query.Where(p => p.ReplacedText == query.Max(p => p.ReplacedText))
.First()
.Col;
Console.WriteLine("Max: {0}, Result: {1}", max, result);
根據您的最終目標有可能停在max
變量,並在前面加上它的「 EU「文本以避免獲取列名稱的第二個查詢。
編輯:正如在評論中提到,這種方法的缺點是,排序上的文字而不是數值做,我們目前無法翻譯Int32.Parse
上的SQL。
我喜歡你的建議,我會接受它,但不幸的是,我的前綴(和長度)不是一個常量,所以我將不得不動態生成表達式。我不喜歡,我正在想方法來改變模式,以便我可以解決這個問題。 – cdonner
在前面使用沒有通配符的'LIKE'的好處之一就是它對索引很友好(可以對索引進行範圍檢查)。 – Ruben
可變長度表達式的一種非常聰明的替代方法。在字符串中的任何位置查找非數字字符。謝謝你的提示! – BlueMonkMN