续:关于SQL语句改成LINQ TO ef【多表多字段连接】

knife_s 2014-09-21 12:01:02
前贴:
http://bbs.csdn.net/topics/390889618

前贴中涉及的SQL语句


SELECT COPMA.MA002 AS 客户简称,COPTC.TC001 AS 订单单别, COPTC.TC002 AS 订单单号,
COPTD.TD003 AS 订单序号,CONVERT(datetime,COPTD.TD013) 交货日,
CONVERT(datetime,COPTC.TC003) AS 订单日期,
COPTD.TD016 订单状态,COPTD.TD004 AS 品号 FROM COPTD
INNER JOIN COPTC ON COPTD.TD001 = COPTC.TC001 AND COPTD.TD002 = COPTC.TC002
left JOIN COPMA ON COPTC.TC004 = COPMA.MA001
WHERE 1=1 and
COPTC.TC003 >='20140701' AND COPTC.TC003 <='20140716'


为了能先用我已知的方法来完成,只好建了一个实体类,把要返回的字段封装了,如下

string sqlStr = " Select MA002,TD001,TD002,TD003,TD004,TD005,TD006,TD008,TD009,TD011,TD012,TD013,TC003 "
+ " from COPTD left join COPTC ON TC001 = TD001 AND TC002 = TD002 "
+ " left join COPMA ON MA001 = TC004 "
+ " Where MA002 like '%" + MA002
+ "%' AND TD004 like '%" + TD004
+ "%' AND TD005 like '%" + TD005
+ "%' AND TD006 like '%" + TD006
+ "%'";
var order =
erp.Database.SqlQuery<COPMA_COPTC_COPTD>(sqlStr);

然后再去进行分页,排序之类的操作,虽然没啥问题,总觉得不好
后来尝试了一下其他方法
如一 (由于关键字段都是固定长度的字符型,相加没啥问题)

var bbb = (from tc in erp.COPTC
join td in erp.COPTD on tc.TC001 + tc.TC002 equals td.TD001 + td.TD002
join ma in erp.COPMA on tc.TC004 equals ma.MA001
select new
{
ma.MA002,
tc.TC003,
tc.TC004,
tc.TC005,
td.TD003,
td.TD001,
td.TD002,
td.TD006,
td.TD007
}).Take(30);


如二

var ccc = (from tc in erp.COPTC
select new
{
tc.TC001,
tc.TC002,
tc.TC003,
tc.TC004,
aaa = from td in erp.COPTD
where td.TD001 == tc.TC001 && td.TD002 == tc.TC002
select new
{
td.TD001,
td.TD002,
td.TD003,
td.TD004
},
bbb = from ma in erp.COPMA
where ma.MA001 == tc.TC004
select new
{
ma.MA002
}
}).Take(30);


经过比较,这样看来,我觉得还是用SQL语句更满足需要,因为本身数据库存放日期日段为字符串,类似于"20140801"之类的,用查询语句可以直接> < >=之类的,麻烦的,不得不给每个查询做一个视图实体类,这是个痛苦的工作

而使用动态类型,还没办法直接在视图中使用,得转为JSON然后再用JS进行处理,对于我这样的初学者也是痛苦的事情
而使用版主q107770540 中

Convert.ToDateTime(cc.TC003) > Convert.ToDateTime("2014-07-01")

这种语句会报错
我也在System.Data.Linq.SqlClient System.Data.Objects.SqlClient中搜寻了一番,没找到合适的函数

说了这么多,我就想向各位高人请教一下,
一般情况下,或者说理论上,对于多表【可能一个查询中涉及到十来张表也有可能】多关键字的连接查询,大家是怎么做的,
如能贴上您的范例,不胜感激

...全文
362 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
knife_s 2014-09-27
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
对于复杂的,在ef中执行linq to entity 查询会非常的不便; 我的处理,就是把查询语句改成视图,在数据库中增加相应的空表结构,也就是表中的列都是你视图中查询的数据列;更新数据库模型映射,这样就能直接使用view; 另如果存在查询,再创建proc,传入查询条件 对 view进行查询返回;多建一个view或者proc 不费什么劲、
谢谢,主要是数据库为ERP的数据库,往里面加东西总觉得不好
threenewbee 2014-09-22
  • 打赏
  • 举报
回复
对,用视图或者存储过程,然后ef会为你产生实体类代码,不需要手写。
exception92 2014-09-22
  • 打赏
  • 举报
回复
对于复杂的,在ef中执行linq to entity 查询会非常的不便; 我的处理,就是把查询语句改成视图,在数据库中增加相应的空表结构,也就是表中的列都是你视图中查询的数据列;更新数据库模型映射,这样就能直接使用view; 另如果存在查询,再创建proc,传入查询条件 对 view进行查询返回;多建一个view或者proc 不费什么劲、
q107770540 2014-09-21
  • 打赏
  • 举报
回复
cc.TC003 COPTD.TD013 这些列在数据库是什么类型的 对于逻辑复杂的SQL语句,建议你封装成存储过程,在代码中映射成方法直接调用

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧