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

sip*_*wiz 1 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
Run Code Online (Sandbox Code Playgroud)

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

mat*_*mc3 5

您可以使用SqlMethodsin 来执行SQL Like查询System.Data.Linq.SqlClient.

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

根据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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)