我有一个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表达式来实现同样的目的?
您可以使用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)