EFCORE 学习笔记 1
1 static void main(string[] args) 2 { 3 using (var db = new TestDbContext()) 4 { 5 Console.WriteLine(db.Users.Where(e => e.Id < 0).Max()); 6 } 7 } 8 9 [Table("Sys_User")] 10 public class User 11 { 12 public int Id { get; set; } 13 [Required] 14 [MaxLength(50)] 15 public string Name { get; set; } 16 [Required] 17 [MaxLength(20)] 18 public string UserName { get; set; } 19 [Required] 20 [MaxLength(50)] 21 public string Password { get; set; } 22 public WechatInfo Wechat { get; set; } 23 public List<Role> Roles { get; set; } 24 public List<Dept> Depts { get; set; } 25 }
控制台程序如上述代码,运行会抛出异常如下:
info: 2021/9/12 星期日 20:06:53.584 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT MAX([s].[Id])
FROM [Sys_User] AS [s]
WHERE [s].[Id] < 0
Unhandled exception. System.InvalidOperationException: Sequence contains no elements.
at lambda_method7(Closure , QueryContext , DbDataReader , ResultContext , SingleQueryResultCoordinator )
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext() in Microsoft.EntityFrameworkCore.Relational.dll:token 0x60017af+0x9c
at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Boolean& found) in System.Linq.dll:token 0x60000f6+0x43
at lambda_method8(Closure , QueryContext )
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query) in Microsoft.EntityFrameworkCore.dll:token 0x600089d+0x70
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression) in Microsoft.EntityFrameworkCore.dll:token 0x6000833+0x0
at System.Linq.Queryable.Max[TSource,TResult](IQueryable`1 source, Expression`1 selector) in System.Linq.Queryable.dll:token 0x6000159+0x1c
at <Program>$.<Main>$(String[] args) in C:\Users\Administrator\source\repos\EFCoreTest\EFCoreTest\Program.cs:line 11
如此产生疑惑,EFCORE执行按道理只要是能正常解析成SQL语句的应该不会有问题。将info打印出的生成SQL语句直接放入Sqlserver中也能够执行成功,只是查询结果为null

猜测可能是在EFCORE拿到查询结果之后的某个步骤出现了,C#语法的异常。因为指定获取的是Id的最大值,类型为int,不能接收空值。
尝试将:
Console.WriteLine(db.Users.Where(e => e.Id < 0).Max(e => e.Id));
改为:
Console.WriteLine(db.Users.Where(e => e.Id < 0).Max(e => (int?)e.Id));
改完后执行
Hello, World!
info: 2021/9/12 星期日 20:15:25.731 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT MAX([s].[Id])
FROM [Sys_User] AS [s]
WHERE [s].[Id] < 0
C:\Users\Administrator\source\repos\EFCoreTest\EFCoreTest\bin\Debug\net6.0\EFCoreTest.exe (进程 14504)已退出,代码为 0。
按任意键关闭此窗口. . .
未报异常。所以很可能大部分取计算取值都有这个问题,异常应该是出在获取到数据库执行结果后进行反射赋值时,没有发现符合类型的值集合。个人感觉有点无语,不知道算不算是微软设计时的一个小BUG,估计类似的聚合函数都有类似的问题,使用的时候要注意。

浙公网安备 33010602011771号