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的表中多列检索多个关键字
使用 SQL Server 数据库将 SQL 查询转换为 Linq
使用 SQL Server Compact Edition 的 Linq-to-SQL