簡體   English   中英

Linq與兒童狀況分組

[英]Linq grouping with child condition

我有如下的ORM數據類型

public class PackData
{
   public int PackId
   public int ClientId
   public DateTime DateCreated
   public List<PackItemData> PackItems
}

public class PackItemData
{
   public int PackId
   public string DeviceId
}

我可以用Linq查詢PackData和PackItemData

var data = DataTable.Where(pack =>  pack.DateCreated >= startDate 
                                    && pack.DateCreated <= endDate)

我想分組/區分子數據(PackItemData)以獲取設備ID的唯一結果

我該如何實現?

我認為您正在尋找SelectMany 這會將您的List<List<PackItemData>>展平到List<PackItemData>

var data=DataTable.Where(pack =>  pack.DateCreated >= startDate 
                                  && pack.DateCreated <= endDate)
                   .SelectMany(i => i.PackItems)
                   .GroupBy(i => i.DeviceId).Select(i => i.First());
var groups = DataTable
    .Where(pack => pack.DateCreated >= startDate && pack.DateCreated <= endDate)
    .SelectMany(pack => pack.PackItems)
    .GroupBy(item => item.DeviceId);

您可能想從SelectMany開始,它將允許您枚舉所有PackDatas中的所有PackItem。 這為您提供了IEnumerable<PackItemData> ,然后您可以在分組中使用它。

Linq GroupBy和Distinct方法應該可以滿足您的需求。

var data=DataTable.Where(pack => pack.DateCreated >= startDate && pack.DateCreated <= endDate)
                  .Select( pack => pack.PackItems)
                  .GroupBy( p => p.PackId, p => p.DeviceId, (key, p) => new PackItemData { PackId = key, DeviceId = p});

我還不能100%地做到這一點,因為我還沒有進行測試,但這應該使您接近要去的地方。

資料來源: LINQ中的分組依據

 var data = DataTable.Where(pack =>  pack.DateCreated >= startDate 
                              && pack.DateCreated <= endDate).SelectMany(s=> s.PackItems).GroupBy(p => p.DeviceId).Select(r=> r);

我認為這應該有效。

暫無
暫無

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

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