Вы можете использовать функцию 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", чтобы избежать получения второго запросаимя столбца.
РЕДАКТИРОВАТЬ: , как упомянуто в комментариях, недостатком этого подхода является то, что упорядочение выполняется по тексту, а не по числовым значениям, и в настоящее время нет перевода для Int32.Parse
SQL.