Linq-to-SQL表达式从文本列获取最大数值

时间:2010-08-05 01:05:16

标签: linq-to-sql

我有一个nvarchar SQL列,主要包含数值。我正在尝试提出一个L2S表达式,它会在忽略任何非数字值的同时获取最大数值。

完成这项工作的SQL是:

select top 1 value from identifier where and patindex('%[^0-9]%', value) = 0 order by CAST(value AS INT) desc

我可以用什么LINQ表达式来实现同样的目的?

1 个答案:

答案 0 :(得分:5)

您可以使用SqlMethods中的System.Data.Linq.SqlClient进行SQL Like查询。

(from a in identifier
where !SqlMethods.Like(a.value, "%[^0-9]%")
select a).Max(x => Convert.ToInt64(x.value))

根据LinqPad:

,此Linq语句成为此查询
-- Region Parameters
DECLARE @p0 VarChar(8) = '%[^0-9]%'
-- EndRegion
SELECT MAX([t1].[value]) AS [value]
FROM (
    SELECT CONVERT(BigInt,[t0].[value]) AS [value], [t0].[value]
    FROM [Identifier] AS [t0]
    ) AS [t1]
WHERE NOT ([t1].[value] LIKE @p0)

LinqPad是一种很好的方式来查询你是否能得到你想要的东西。我发现只有唯一没有良好L2S等价的SQL语句是带有PIVOT关键字的SQL语句。除此之外,通常有办法获得你想要的东西。

如果您想要整个记录而不仅仅是MAX()值,您可以这样查询:

(from a in Accounts
orderby (!SqlMethods.Like(a.AccountNumber, "%[^0-9]%") ?
                      Convert.ToInt64(a.AccountNumber) : 0)
descending
select a).Take(1)