Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值

Posted

技术标签:

【中文标题】Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值【英文标题】:Linq - Find max value from a nvarchar type column in SQL Server 【发布时间】:2020-03-16 21:41:29 【问题描述】:

在我的 SQL Server 列中,我的值如下所示。

3.2.31
5.6.81
8.0.3521
25

当我尝试使用 LINQ 而不是 25 获取 MAX 值时,我得到的是 8.0.3521。下面是我的 LINQ 查询。

var maxCode = InventoryDB.Products.where(p => p.Name == "Reva Health").select( m => m.Code).Max();

Code的列类型为nvarchar

【问题讨论】:

【参考方案1】:

这是 C# 中的代码。假设这些值是字符串:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Linq

    class Program
    
        static void Main(string[] args)
        
            IEnumerable<string> listOfStrings = new List<string>()
            
                "3.2.31",
                "5.6.81",
                "8.0.3521",
                "25"
            ;

            var doubleList = listOfStrings.ToList()
                .Select(y => y.Contains(".") ? 
                    Convert.ToDouble(y.Split(".").FirstOrDefault()) : 
                    Convert.ToDouble(y))
                .OrderByDescending(x => x);

            foreach(var member in doubleList)
            
                Console.WriteLine(member);
            
        
    

注意我.ToList() IEnumerable 认为您可能会使用此代码。您希望在生成这些 linq 语句之前从您的 entityframework 对象中获取数据,这样它就不会生成不需要的 SQL。

【讨论】:

此查询不适用于 Linq-to-SQL,因为它无法转换 string.Split 方法。将所有内容都放到内存中是个坏主意,因为最终可能会有很多条目需要处理。 @juharr 如果您在 where 子句之后运行 ToList() 方法。它将调用 Linq-to-Sql。到那时,据我了解,以下语句将不会被评估为 SQL。 如果您想建议将其拉到内存中,您应该使用AsEnumerable 以避免创建中间列表。【参考方案2】:

问题是你有一个字符串,而不是一个数字。这在 SQL Server 中很难处理。以下可能就足够了:

select top (1) col
from t
order by try_convert(int, left(col, charindex('.', col) - 1)) desc,
         col desc;

这个版本并不完美。它在第一个时期之前按数字排序,这足以满足您问题中的数据。

【讨论】:

【参考方案3】:

你可以试试下面的表达式:

var maxCode = InventoryDB.Products.where(p => p.Name == "Reva Health")
.Select(l => new  
                  s=Int32.Parse(l.Code.Substring(0,l.Code.IndexOf('.')!=-1?l.Code.IndexOf('.'):l.Code.Length)) 
                  )
.Max(i=>i.s);

【讨论】:

我收到此错误 - LINQ to Entities 无法识别方法 'Int32 Parse(System.String)' 方法,并且此方法无法转换为存储表达式。 它仅用于将字符串解析为 int,您可以根据系统配置使用 Convert.ToInt32()int.Parse()

以上是关于Linq - 从 SQL Server 中的 nvarchar 类型列中查找最大值的主要内容,如果未能解决你的问题,请参考以下文章

C#中如何用Linq在SQL Server的表中多列检索多个关键字

linq 和并行性 - SQL Server

使用 SQL Server 数据库将 SQL 查询转换为 Linq

使用 SQL Server Compact Edition 的 Linq-to-SQL

从 C# 保存到 SQL 中的 DATE 类型列 - Linq to SQL

将 SQL Server 查询转换为 Linq 查询