如何在实体框架Linq中进行外连接和分组?

时间:2015-07-10 19:17:23

标签: linq entity-framework

在执行外部联接和分组时,我无法让Linq statemnt工作。这是我试图完成的SQL版本:

select p.PRIMARY_KEY, min(p.EFFECTIVE_DATE), sum(IsNull(c.PAID_INDEMNITY, 0))
from PRMPOLCY p 
left outer join CLMMAST c on p.PRIMARY_KEY = c.POLICY_NO 
where p.UNDERWRITER_UID = 93
GROUP BY p.PRIMARY_KEY 

这是我在Linq中所拥有的(不起作用):

var result = from p in context.PRMPOLCies
             join c in context.CLMMASTs on p.PRIMARY_KEY equals c.POLICY_NO into polClm
             where (p.UNDERWRITER_UID == underwriter)
from grp in polClm.DefaultIfEmpty()
group grp by p.PRIMARY_KEY into g
         select new PolicySummation()
                                     {
                                         PolicyNo =  g.Key,
                                         Incurred = g.Sum(grp => grp.PAID_INDEMNITY ),
                                         EffDate = g.Min(grp => grp.PRMPOLCY.EFFECTIVE_DATE
                                     };

将我的头撞在墙上试图把它弄清楚!

2 个答案:

答案 0 :(得分:1)

假设您在PRMPOLCYCLMMAST之间设置了导航属性,则不应该明确指定连接。在没有显式连接的情况下在linq中表达大多数查询要容易得多,而是将结构视为层次结构。我不知道您的模型属性名称的具体细节,但我猜测这样的东西会起作用。

var result =
    from p in context.PRMPOLCies
    where (p.UNDERWRITER_UID == underwriter)
    select new PolicySummation {
        PolicyNo = p.PRIMARY_KEY,
        Incurred = p.CLMASTs.Select(c => c.PAID_INDEMNITY).DefaultIfEmpty().Sum(),
        EffDate = p.EFFECTIVE_DATE,
    };

答案 1 :(得分:0)

您需要在group子句中包含这两个表,如下所示:

group new { p, grp } by p.PRIMARY_KEY into g

然后在Sum / Min

g.Sum(grp => grp.grp == null ? 0 : grp.grp.PAID_INDEMNITY )
g.Min(grp => grp.p.PRMPOLCY.EFFECTIVE_DATE)