2015-07-10 70 views
1

我在执行外连接和分组时遇到问题,无法让我的Linq statemnt工作。下面是我想要完成一个版本的SQL:如何在实体框架Linq中外连接和分组?

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 
            }; 

打我的头撞在墙上试图figurwe这个出来!

回答

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, 
    }; 
+0

感谢递归,看起来像正确的方法。但是,那 ??运算符没有编译 - '左操作数的??运算符应该是引用或可为空的类型'c.PAID_INDEMNITY不可空。有任何想法吗? –

+0

@JimHoagland:我认为它是可空的。你应该能够删除'?? 0'。 – recursive

+0

非常感谢递归! –

0

您需要包括这样的组子句中都你的表:

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) 
+0

谢谢!这仍然给我一个问题,因为在我的结果的一些行中,PAID_INDEMNITY的总和为空值。我该如何做Sum(IsNull(grp => grp.grp.PAID_INDEMNITY,0))? –

+0

@JimHoagland - 你可以使用三元运算符'? :' – Aducci