EF Core 6中DbFunctions.CreateDateTime无法转换的问题求助
解决EF Core 6中DbFunctions.CreateDateTime无法转换的问题
问题根源
System.Data.Entity.DbFunctions是Entity Framework 6(EF6)专属的API,EF Core 6并不兼容这个类,所以Linq查询无法被转换为SQL,抛出异常。
解决方法
方法1:直接通过年月数值比较(推荐,兼容性最好)
不需要调用任何数据库函数,直接通过年份和月份的数值逻辑过滤,EF Core能完美转换为对应的SQL语句:
var initialYear = request.InitialYear; var initialMonth = request.InitialMonth; var finalYear = request.FinalYear; var finalMonth = request.FinalMonth; query = query.Where(q => // 大于等于起始年月 (q.Year > initialYear || (q.Year == initialYear && q.Month >= initialMonth)) && // 小于等于结束年月 (q.Year < finalYear || (q.Year == finalYear && q.Month <= finalMonth)) );
方法2:使用EF Core专属的数据库函数
EF Core提供了自己的函数集Microsoft.EntityFrameworkCore.EF.Functions,可以用DateFromParts来构造日期,需要先引入命名空间Microsoft.EntityFrameworkCore:
using Microsoft.EntityFrameworkCore; var initialDate = new DateTime(request.InitialYear, request.InitialMonth, 1); var finalDate = new DateTime(request.FinalYear, request.FinalMonth, 1); query = query.Where(q => EF.Functions.DateFromParts(q.Year, q.Month, 1) >= initialDate.Date && EF.Functions.DateFromParts(q.Year, q.Month, 1) <= finalDate.Date );
该方法会被EF Core转换为数据库对应的日期构造函数(比如SQL Server的DATEFROMPARTS),需确保数据库支持该函数。
内容的提问来源于stack exchange,提问作者Danilo Silva
相关产品推荐
相关产品推荐

