导出日期时间的日期部分为字符串列表时遇LINQ to Entities错误求助
问题解决:LINQ to Entities不支持ToShortDateString()方法
错误原因
LINQ to Entities会把查询表达式转换成SQL语句在数据库端执行,但ToShortDateString()是.NET客户端专属方法,无法被转换为对应的SQL操作,因此抛出NotSupportedException。
解决方案
提供两种可行的修改方式:
方式一:先加载数据到内存再转换
通过AsEnumerable()将查询切换为LINQ to Objects(数据加载到本地内存),再执行日期字符串转换,适合数据量较小的场景:
public List<string> ReadDatesDAL(string d) { var q = db.visits.Include("Doctor") .Where(i => i.delstatus == false) .Where(i => i.doctor.name == d) .Select(i => i.start) .AsEnumerable() .Select(date => date.ToShortDateString()); return q.ToList(); }
方式二:用EF内置函数在数据库端处理日期
利用EF提供的数据库兼容函数先截断时间部分,再转换为字符串,能减少内存占用,适合大数据量场景:
- EF6需引用
System.Data.Entity命名空间,使用DbFunctions.TruncateTime:
using System.Data.Entity; public List<string> ReadDatesDAL(string d) { var q = db.visits.Include("Doctor") .Where(i => i.delstatus == false) .Where(i => i.doctor.name == d) .Select(i => DbFunctions.TruncateTime(i.start)) .AsEnumerable() .Select(date => date.Value.ToShortDateString()); return q.ToList(); }
- EF Core则使用
EF.Functions.TruncateTime(需引用Microsoft.EntityFrameworkCore命名空间),逻辑一致。
内容的提问来源于stack exchange,提问作者selda kabirnejat
相关产品推荐
相关产品推荐

