2015-07-10 2 views
1

У меня возникли проблемы с тем, чтобы моя работа Statjnt Linq работала при выполнении внешнего соединения и группы. Вот SQL версия того, что я пытаюсь выполнить:Как выполнить внешнее объединение и группировать в Entity framework 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

Если у вас есть свойство навигации установить между PRMPOLCY и CLMMAST , вам не нужно явно указывать соединение. Гораздо проще выразить большинство запросов в 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 не имеет значения NULL. Есть идеи? –

+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

Спасибо! Это все еще дает мне проблему, поскольку в некоторых строках моего результата у меня есть значение null для суммы PAID_INDEMNITY. Как сделать Sum (IsNull (grp => grp.grp.PAID_INDEMNITY, 0))? –

+0

@JimHoagland - вы можете использовать тернарный оператор '? : ' – Aducci

Смежные вопросы