【问题标题】:Linq - Find max value from a nvarchar type column in SQL ServerLinq - 从 SQL Server 中的 nvarchar 类型列中查找最大值
【发布时间】: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

【问题讨论】:

    标签: c# sql sql-server linq linq-to-sql


    【解决方案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()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2023-04-02
      • 2013-09-07
      相关资源
      最近更新 更多