如何在Linq to Entities中实现SQL Server端执行convert(NVARCHAR,日期,102)转换
Linq to Entities 服务端实现日期格式化转换方案
完全可以在SQL Server服务端实现你要的convert(NVARCHAR, MyDate, 102)转换逻辑,不同EF版本实现方式如下:
EF Core 版本
EF Core 原生支持将带格式的DateTime.ToString()重载翻译为对应SQL的CONVERT函数,你直接写如下LINQ即可:
var query = dbContext.MyTable .Select(item => new { Temp = item.MyDate.ToString("yyyy.MM.dd") + " " + item.AccountId.ToString() });
上述代码生成的SQL会自动包含CONVERT(VARCHAR, MyDate, 102)逻辑,全程在数据库端执行,不需要拉取数据到本地转换。
EF6(.NET Framework 版本)
你提到的SqlClient.SqlFunctions类确实没有直接的日期格式化方法,可选择以下两种方案实现服务端执行:
方案1:使用SqlFunctions + DbFunctions 拼接日期格式
所有函数都会被翻译为SQL函数,执行逻辑完全在服务端:
var query = context.MyTable .Select(item => // 拼接102格式的日期:yyyy.MM.dd DbFunctions.Right("0000" + SqlFunctions.StringConvert((double)item.MyDate.Year), 4) + "." + DbFunctions.Right("00" + SqlFunctions.StringConvert((double)item.MyDate.Month), 2) + "." + DbFunctions.Right("00" + SqlFunctions.StringConvert((double)item.MyDate.Day), 2) + " " + // 转换AccountId为字符串 SqlFunctions.StringConvert((double)item.AccountId).Trim() );
方案2:直接执行原生SQL查询
如果不想拼接格式化逻辑,也可以直接写原生SQL查询,性能更高:
// 自定义接收类需要包含Temp属性和查询返回的其他必要字段 var query = context.Database.SqlQuery<YourCustomDto>( "Select convert(NVARCHAR, MyDate, 102) + ' ' + convert(NVARCHAR, AccountId) AS Temp from MyTable" );
内容的提问来源于stack exchange,提问作者Istvan Heckl
相关产品推荐
相关产品推荐

