C# 带子条件的Linq分组

C# 带子条件的Linq分组,c#,linq,distinct,grouping,C#,Linq,Distinct,Grouping,我有如下的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 } 公共类PackData

我有如下的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
}
公共类PackData
{
公共小背包
公共int客户端ID
已创建公共日期时间日期
公开名单包裹
}
公共类PackItemData
{
公共小背包
公共字符串设备ID
}
我可以用Linq查询PackData和PackItemData

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

&&pack.DateCreated我想您正在寻找
SelectMany
。这将使您的
列表变得平坦

var data=DataTable.Where(pack=>pack.DateCreated>=startDate
&&pack.DateCreated i.PackItems)
.GroupBy(i=>i.DeviceId).Select(i=>i.First());
var group=DataTable
.Where(pack=>pack.DateCreated>=startDate&&pack.DateCreated pack.PackItems)
.GroupBy(item=>item.DeviceId);
您可能希望从
SelectMany
开始,这将允许您枚举所有PackDatas中的所有packitem。这将为您提供一个
IEnumerable
,您可以在分组中使用它。

Linq和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});
var data=DataTable.Where(pack=>pack.DateCreated>=startDate&&pack.DateCreated pack.PackItems)
.GroupBy(p=>p.PackId,p=>p.DeviceId,(key,p)=>newpackitemdata{PackId=key,DeviceId=p});
我不是百分之百地认为这是可行的,因为我还没有运行测试,但这应该会让你接近你要去的地方

来源:

var data=DataTable.Where(pack=>pack.DateCreated>=startDate
&&pack.DateCreated s.PackItems).GroupBy(p=>p.DeviceId).选择(r=>r);

我认为这应该是可行的。

如果您显示一个示例输入和预期输出,这可能会有所帮助。您是否可以更具体一些??您是否试图按设备Id对PackData进行分组?我预期输出,列出所有设备都已不同的列表,因此我的设备Id对于所有设备都是唯一的列表,这意味着,对于特定设备,列表只有一个,但ou是什么t此查询的结果??他想对项目ryt进行分组??此查询将只提供不同的设备Id。此查询给我一个PackItems结果数据,我如何才能获得PackData list result,该PackData list result是所有pack data的设备Id已经不同的打包项目?请改用SelectMany。此查询给我一个PackItems result数据,我如何才能获得PackData list resultt对于所有包数据,包装项已通过设备Id区分
var groups = DataTable
    .Where(pack => pack.DateCreated >= startDate && pack.DateCreated <= endDate)
    .SelectMany(pack => pack.PackItems)
    .GroupBy(item => item.DeviceId);
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});
 var data = DataTable.Where(pack =>  pack.DateCreated >= startDate 
                              && pack.DateCreated <= endDate).SelectMany(s=> s.PackItems).GroupBy(p => p.DeviceId).Select(r=> r);