EF(Linq)框架使用过程中的小技巧汇总
这篇博客总结本人在实际项目中遇到的一些关于EF或者Linq的问题,作为以后复习的笔记或者供后来人参考(遇到问题便更新)。
目录
- 技巧1: DbFunctions.TruncateTime()的使用
- 技巧2: Linq中对Datetime字段按照年月分组以及DbFunctions.CreateDateTime()的使用2016/4/2 【新增】
技巧1: DbFunctions.TruncateTime()的使用
有没有遇到做这样的错误:
- LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression.【LINQ to Entities不能识别‘System.String ToShortDateString()’方法】
- System.NotSupportedException: The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.【LINQ to Entities不支持类型成员‘Date’,仅支持初始化器,实体成员和实体导航属性】
var query = from order in _orderRepository.GetAll()
.Where(o => o.OrderType == OrderType.LineSold)
.WhereIf(input.OrderDate!=DateTime.MinValue,o=>o.OrderDate.Date==input.OrderDate.Date)
.WhereIf(!string.IsNullOrEmpty(input.OrderNo),o=>o.OrderNo==input.OrderNo||o.OrderNo.EndsWith(input.OrderNo))
.WhereIf(input.Status!=-1,o=>o.Status==input.Status)
join device in _deviceRepository.GetAll()
.WhereIf(!string.IsNullOrEmpty(input.Code),d=>d.Code==input.Code) on order.TerminalID equals device.Id
join trans in _transDetailRepository.GetAll()
.WhereIf(!string.IsNullOrEmpty(input.PayOrderNo),t=>t.PayOrderNo==input.PayOrderNo||t.PayOrderNo.EndsWith(input.PayOrderNo))
on order.OrderNo equals trans.OrderNo into leftJoinResults
from leftJoinResult in leftJoinResults.DefaultIfEmpty( )
select new LineSoldOrderOutput
{
Code = device.Code,
Id = order.Id,
Amount = order.PayFee,
OrderDate = order.OrderDate,
OrderNo = order.OrderNo,
PayOrderNo = leftJoinResult.PayOrderNo??"还没产生支付方订单号",
Status = order.Status
};
为啥有这种需求?
因为数据库中的DateTime类型都是以2016-03-11 11:25:59
这种形式保存的,而我在客户端查询数据时,只要传入日期就行,不需要传入时间部分,所以必须把时间部分咔嚓掉(剪掉)。
正如上面的代码第三行,一开始是那么写的,结果报上面的第二种错误。
第二次改成了.WhereIf(input.OrderDate!=DateTime.MinValue,o=>o.OrderDate.ToShortDateString()==input.OrderDate.ToShortDateString())
,结果报上面的第一种错误。
解决办法
.WhereIf(input.OrderDate!=DateTime.MinValue,o=>DbFunctions.TruncateTime(o.OrderDate)
【我用的是EF6,Truncate,翻译为截断,该函数顾名思义也就是把时间部分去掉,只保留日期部分】
EF6以前你可能需要用EntityFunctions.TruncateTime(p.date) == dateWithoutTime
其他重点
我上面的代码还有使用linq进行三张表的连接,更重要的是,前两张表是内连接,之后再进行左连接。不熟悉linq语法的可以学习一下。
技巧2: Linq中对Datetime字段按照年月分组以及DbFunctions.CreateDateTime()的使用
有时候,在处理数据的时候,需要对数据进行分组,而且是对Datetime类型的字段按照年月进行分组,下面分别使用Linq的方法语法和查询语法进行分组:
方法语法
dateIncomeDtos = query
.Where(o => o.OrderDate >= input.Start && o.OrderDate < DbFunctions.AddMonths(input.End,1))
.OrderBy(o => o.OrderDate)
.GroupBy(o => DbFunctions.CreateDateTime(o.OrderDate.Year, o.OrderDate.Month, 1, 0, 0, 0))
.Select(group => new DateIncomeDto { Date = group.Key.Value, Income = group.Sum(item => item.PayFee ?? 0) });
查询语法
dateIncomeDtos = from q in query
group q by new {date = new DateTime(q.OrderDate.Year, q.OrderDate.Month, 1)}
into g
select new DateIncomeDto
{
Date = g.Key.date
};
方法语法使用的是Linq中提供的DbFunctions类中的CreateDateTime方法,给day的参数传入一个1至29中的整数,保证每个月中有这一天即可(我这里传入了1),这样,在分组的时候,EF就会将数据库中的每条记录的OrderDate字段的年和月进行分组。
查询语法思想是一样的,只不过用到了匿名类而已。
EF(Linq)框架使用过程中的小技巧汇总的更多相关文章
- EF(Linq)框架使用过程中的小技巧汇总 dbfunctions
这篇博客总结本人在实际项目中遇到的一些关于EF或者Linq的问题,作为以后复习的笔记或者供后来人参考(遇到问题便更新). 目录 技巧1: DbFunctions.TruncateTime()的使用 技 ...
- VS2017 + EF + MySQL 我使用过程中遇到的坑
原文:VS2017 + EF + MySQL 我使用过程中遇到的坑 写在前面: 第一次使用MySQL连接VS的时候本着最新版的应该就是最好的,在MySQL官网下载了最新版的MySQL没有并且安装完成之 ...
- 关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录)
关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录) 作者:王可利(Star·星星) HTML中 相对定位:position:relative; 绝对定位:position ...
- 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)
利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录) 作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...
- html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)
html/css 盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width 是"宽 ...
- ESXi与物理交换机静态链路聚合配置过程中的小陷阱
作者:陆斌文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影响 ...
- 杂谈---小故事小道理,面试中的小技巧(NO.2)
本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧
[源码下载] 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧 作者:webabcd 介绍背水一战 Wind ...
随机推荐
- 我利用网上代码开发的JQuery图片插件
我利用网上代码开发的JQuery图片插件 代码如下 (function($){ $.fn.FocusPic = function(options){ var defaults = { interval ...
- jenkins自动部署maven工程到服务器----SSH+shell
今天心情不是很美丽,玩笑话可能没那么多,还是回归正题 1.指定SSH端口.用户名.密码相关配置,我这里没有需要配置密钥啥的. 2.接下来再创建任务的时候,进行SSH配置: 3.看到这里,是不是很想打我 ...
- [03]APUE:文件 I/O
[a] open #include <fcntl.h> int open(const char *path, int oflag, ... ,mode_t mode) 成功返回文件描术符, ...
- 菜单的隐藏&显示
//还是先上万一老师的原代码 //隐藏与显示菜单Self.Menu := nil; {隐藏菜单} Self.Menu := MainMenu1; {显示菜单} //初一看到代码,我有点抓不到感觉的意思 ...
- appium踩过的坑(2):java.lang.NoSuchFieldError:INSTANCE
- 讲解版的导航高亮(新手福利)原生JS
1.先写样式: 导航的排版样式: 导航对应高亮样式: .d6000f{ background:red; } .d6000f a{ color:#fff; } 我这个地方导航高亮样式为背景红色,字体颜色 ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- JSP/Servlet相关
1 简介 JSP(Java Server Page)和Servlet是JavaEE规范的两个基本成员,是JavaWeb开发的重点. JSP的本质是Servlet,当用户向指定的Servlet发送请求时 ...
- 解决 IE 6/7 中console对象兼容性问题
话不多说,直接上代码 (function (){ //创建空console对象,避免JS报错 if(!window.console) window.console = {}; var console ...
- DOM 事件
1.注册事件 // 事件处理函数 function handleMouseOver(event) { // process ...... } p.addEventListener("mous ...