您可以通过向 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”文本,以避免获取列名的第二个查询。
编辑:正如 cmets 中所述,这种方法的缺点是排序是基于文本而不是数值完成的,并且目前在 SQL 上没有Int32.Parse 的翻译。