score:0

in this case it's much easier to do the join in the anonymous type:

from component in materials.oftype<container>().where(m => m.active)
select new
{
   id = component.id,
   name = component.name,
   subtype = component.subtype,
   size = component.size,
   materialids = component.materials.select(x => x.id),
   brandnames = component.brands.select(x => x.name),
   segmentratings = (from segmentfinancerating in segmentfinanceratingview
                     where segmentfinancerating.materialid == component.id
                     select segmentfinancerating)
}

you will have an empty collection of segmentratings when there are none for a specific component, giving the same effect as outer join.

score:1

groupby in list doesn't work for you?

var list = (from component in materials.oftype<container>().where(m => m.active)
join segmentfinancerating in segmentfinanceratingview on component.id equals segmentfinancerating.materialid into segmentfinanceratinggroup
from segmentfinanceratingwithdefault in segmentfinanceratinggroup.defaultifempty()
select new
{
   id = component.id,
   name = component.name,
   subtype = component.subtype,
   size = component.size,
   materialids = component.materials.select(x => x.id),
   brandnames = component.brands.select(x => x.name),
   segmentratings = segmentfinanceratingwithdefault
}).tolist().groupby(s=> s.segmentratings);

Related Query

More Query from same tag