我有一个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表达式来实现同样的目的?
答案 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)