簡體   English   中英

LINQ Group通過多表Inner Join和聚合函數

[英]LINQ Group By multiple table Inner Join and aggregate function

我有以下Linq到EF查詢:

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。 (對不起,我本來希望在那里粘貼整個異常,但它不是對操作系統區域設置的不理解)。

但是,如果我在組中包含字段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()
}

在該查詢中, groupedIGrouping<TKey,T> ,其中:

  • T是投影類型,在這種情況下是new { envelope, envType }

  • TKey是分組鍵,在這種情況下(不包括ENVTYPE_COD_OMOLOG ):

     new { fakeCap.FAKECAP_DEST_TARIF, envWeightRange.ENV_WEIGHT_RANGE_CODE } 

除了具有屬性TKey Key之外IGrouping<TKey,T>也可以被視為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分組,並且仍然可以在結果中獲得每組的最大值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM