SQL语句改为LINQ TO ef

SQL语句改成LINQ TO ef
由于某个delphi程序要用C/S改成B/S,临时抱佛脚,用ASP.NET MVC  EF5 C#来做
以前程序都是直接用SQL语句进行查询,现在用EF,单表操作很简单,多表问题来了

一、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' 



二、我照抄的版主q107770540linq语句并稍做改过,很巧,几年前q107770540解答类似问题时也是使用的同样的数据库

            var query = from cc in erp.COPTC
                        join cd in erp.COPTD
                        on new { cc.TC001, cc.TC002 } equals new { cd.TD001, cd.TD002 }
                        into m
                        from n in m.DefaultIfEmpty()
                        join ma in erp.COPMA
                        on new { cc.TC004 } equals new { ma.MA001}
                        where 
                            Convert.ToDateTime(cc.TC003) > Convert.ToDateTime("2014-07-01")
                           && Convert.ToDateTime(cc.TC003) < Convert.ToDateTime("2014-07-31")
                        select new
                        {
                            cc,
                            cd
                        };


报错:
join 子句中其中一个表达式的类型不正确。对“GroupJoin”的调用中的类型推理失败。

另外,我的乱想,由于刚入门,可能见笑了
对IEnumerable反复查询,连接,可以达到相关效果吗?

虽然,可以用以前的方法,ado.net 循环读取DataReader,生成类再传递 给视图,但总觉得不好

级别不够,份很少,见谅
------解决思路----------------------

cc.TC001与 cd.TD001
cc.TC002与cd.TD002 
cc.TC004与ma.MA001

这几个数据类型定义一致吗?
------解决思路----------------------
你可以把SQL语句些到视图里面

然后用LINQ TO EF 直接查询就行了 

就跟查询表一样了 
------解决思路----------------------

            var date1 = Convert.ToDateTime("2014-07-01");
            var date2 = Convert.ToDateTime("2014-07-31");
            var query = from cc in erp.COPTC
                        join cd in erp.COPTD
                        on new { cc.TC001, cc.TC002 } equals new { cd.TD001, cd.TD002 }
                        into m
                        from n in m.DefaultIfEmpty()
                        join ma in erp.COPMA
                        on  cc.TC004.Value  equals  ma.MA001.Value