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,估计类似的聚合函数都有类似的问题,使用的时候要注意。

posted @ 2021-09-12 20:19  阿伟213  阅读(212)  评论(0)    收藏  举报