ISNUMERIC
DataContextの部分クラスにメソッドを追加することで、この関数を利用できます。これは、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」テキストを前に付けて、列名を取得する2番目のクエリを回避できる場合があります。
編集:コメントで述べたように、このアプローチの欠点は、順序付けが数値ではなくテキストで行われ、現在Int32.Parse
SQLでの翻訳がないことです。