2014-01-24 57 views
3

我有以下的LINQ to EF查询:LINQ集团通过多台内部连接和聚合函数

from envelope in ENVELOPEs.AsNoTracking() 
join spool in SPOOLs.AsNoTracking() on envelope.SPOOL_ID equals spool.SPOOL_ID 
join extract in EXTRACTs.AsNoTracking() on spool.EXTRACT_ID equals extract.EXTRACT_ID 
join extractProfile in EXTRACT_PROFILE.AsNoTracking() on extract.EXTRACT_PROFILE_ID equals extractProfile.EXTRACT_PROFILE_ID 
join box in BOXes.AsNoTracking() on envelope.BOX_ID equals box.BOX_ID 
join pallet in PALLETs.AsNoTracking() on box.PALLET_ID equals pallet.PALLET_ID 
join fakeCap in FAKECAPs.AsNoTracking() on envelope.FAKECAP_ID equals fakeCap.FAKECAP_ID 
join envWeightRange in ENVELOPE_WEIGHT_RANGE.AsNoTracking() on envelope.ENV_WEIGHT_RANGE_ID equals envWeightRange.ENV_WEIGHT_RANGE_ID 
join ptype in PTYPEs.AsNoTracking() on spool.PTYPE_ID equals ptype.PTYPE_ID 
join envType in ENVTYPEs.AsNoTracking() on ptype.ENVTYPE_ID equals envType.ENVTYPE_ID 
join boxType in BOXTYPEs.AsNoTracking() on envType.BOXTYPE_ID equals boxType.BOXTYPE_ID 
where spool.JSHEET_ID == 8 
orderby envWeightRange.ENV_WEIGHT_RANGE_CODE, 
    fakeCap.FAKECAP_DEST_TARIF 
group new { envelope, envType } by 
new 
{ 
    fakeCap.FAKECAP_DEST_TARIF, 
    envWeightRange.ENV_WEIGHT_RANGE_CODE  
} into grouped 
select new 
{ 
    FAKECAP_DEST_TARIF = grouped.Key.FAKECAP_DEST_TARIF, 
    ENV_WEIGHT_RANGE_CODE = grouped.Key.ENV_WEIGHT_RANGE_CODE, 
    ENVTYPE_COD_OMOLOG = grouped.Max(item => item.ENVTYPE_COD_OMOLOG), // Error: ENVTYPE_COD_OMOLOG not defined 
    TOTALE_BUSTE = grouped.Count() 
} 

它无法说,申请没有被定义ENVTYPE_COD_OMOLOG。 (对不起,我本来希望在那里粘贴整个例外,但它不是简单的OS语言环境设置)。

但是如果我包括组在现场ENVTYPE_COD_OMOLOG通过不带有聚合函数访问它,它完美的作品:

from envelope in ENVELOPEs.AsNoTracking() 
join spool in SPOOLs.AsNoTracking() on envelope.SPOOL_ID equals spool.SPOOL_ID 
join extract in EXTRACTs.AsNoTracking() on spool.EXTRACT_ID equals extract.EXTRACT_ID 
join extractProfile in EXTRACT_PROFILE.AsNoTracking() on extract.EXTRACT_PROFILE_ID equals extractProfile.EXTRACT_PROFILE_ID 
join box in BOXes.AsNoTracking() on envelope.BOX_ID equals box.BOX_ID 
join pallet in PALLETs.AsNoTracking() on box.PALLET_ID equals pallet.PALLET_ID 
join fakeCap in FAKECAPs.AsNoTracking() on envelope.FAKECAP_ID equals fakeCap.FAKECAP_ID 
join envWeightRange in ENVELOPE_WEIGHT_RANGE.AsNoTracking() on envelope.ENV_WEIGHT_RANGE_ID equals envWeightRange.ENV_WEIGHT_RANGE_ID 
join ptype in PTYPEs.AsNoTracking() on spool.PTYPE_ID equals ptype.PTYPE_ID 
join envType in ENVTYPEs.AsNoTracking() on ptype.ENVTYPE_ID equals envType.ENVTYPE_ID 
join boxType in BOXTYPEs.AsNoTracking() on envType.BOXTYPE_ID equals boxType.BOXTYPE_ID 
where spool.JSHEET_ID == 8 
orderby envWeightRange.ENV_WEIGHT_RANGE_CODE, 
    fakeCap.FAKECAP_DEST_TARIF 
group new { envelope, envType } by 
new 
{ 
    fakeCap.FAKECAP_DEST_TARIF, 
    envWeightRange.ENV_WEIGHT_RANGE_CODE, 
    envType.ENVTYPE_COD_OMOLOG 
} into grouped 
select new 
{ 
    FAKECAP_DEST_TARIF = grouped.Key.FAKECAP_DEST_TARIF, 
    ENV_WEIGHT_RANGE_CODE = grouped.Key.ENV_WEIGHT_RANGE_CODE, 
    ENVTYPE_COD_OMOLOG = grouped.Key.ENVTYPE_COD_OMOLOG, 
    TOTALE_BUSTE = grouped.Count() 
} 
+0

是你的问题解决? – Sankarann

+0

@Sankarann这不是,因为我不明白为什么我不能像我应该使用聚合函数。通过这种方式,我被迫在组中包含很多字段 –

回答

2

在该查询,groupedIGrouping<TKey,T>其中:

  • T是投影类型,在这种情况下为new { envelope, envType }

  • TKey是分组键,在这种情况下(不包括ENVTYPE_COD_OMOLOG):

    new { 
        fakeCap.FAKECAP_DEST_TARIF, 
        envWeightRange.ENV_WEIGHT_RANGE_CODE 
    } 
    

一种IGrouping<TKey,T>,除了具有属性TKey Key也可以作为一个IEnumerable<T>观看。这意味着从每个组获得最大ENVTYPE_COD_OMOLOG,你将需要改变你的选择按以下方式(该Max将适用于超过T顺序):

select new 
{ 
    FAKECAP_DEST_TARIF = grouped.Key.FAKECAP_DEST_TARIF, 
    ENV_WEIGHT_RANGE_CODE = grouped.Key.ENV_WEIGHT_RANGE_CODE, 
    ENVTYPE_COD_OMOLOG = grouped.Max(item => item.envType.ENVTYPE_COD_OMOLOG), 
    TOTALE_BUSTE = grouped.Count() 
} 

这样,你不需要组通过ENVTYPE_COD_OMOLOG,并且仍然可以在结果中获得每个组的最大值。

+0

非常感谢。这两个解释和解决方案。 –

+0

很高兴听到有帮助! –