【问题标题】:Group List by property then return only another property of this grouped objects按属性分组列表然后仅返回此分组对象的另一个属性
【发布时间】:2020-03-11 15:24:10
【问题描述】:

我有一个合同列表,我通过 clientId 将它们捆绑在一起。但我只想返回合同 ID。

Input => 
let c1 = {client:1,id:"c1"}
let c2 = {client:2,id:"c2"}
let c3 = {client:2,id:"c3"}
let c4 = {client:1,id:"c4"}
let c5 = {client:3,id:"c5"}
let list = [c1,c2,c3,c4,c5]

期望的输出:

[[c1.id,c4.id],[c2.id,c3.id],[c5.id]]

我有以下函数,但它通过它的键返回两个子组(这是迄今为止我看到的唯一可访问的东西)

 public JsonResult checkForSameClient(long[] listOfContracts)
    {


        IQueryable<ContratEspace> contrats = contratEspaceRepository.Get(1, listOfContracts.Count(), listOfContracts);
        var contratList = contrats.ToList();

        var finalArray = contrats.GroupBy(c => c.id_clientGestion).ToList();
            var answer = finalArray.Select(c=>c.Key).Distinct().ToList();

        return new JsonResult() { Data = answer };
    }

【问题讨论】:

  • 你试过调试代码吗?
  • 这段代码没有错误,只是没有返回我想要的。
  • 您可以使用调试器检查每一步是否产生正确的结果,从而缩小产生错误数据的地方
  • 是的,问题是我不确定我使用正确的方法来实现我想要的。我有合同列表,然后按 client_id 对其进行分组。但是,我不想返回包含整个对象的子列表的列表,我想要一个包含仅包含合同 ID 的子列表的列表 - 而不是整个合同。
  • 因此,如果代码没有返回您想要的(即没有达到预期的结果),那么它就会被窃听。按照@Renat 的建议,使用调试器单步调试这段代码,看看出了什么问题

标签: c# entity-framework linq group-by


【解决方案1】:

当您使用GroupBy 时,您会得到一个IGrouping,它由群组的Key 组成,同时也是群组成员的IEnumerable。由于您只需要每个成员的id_contrat,因此您需要在保留组的同时选择它。

var answer = contrats.GroupBy(c => c.id_clientGestion)
                     .Select(cg => cg.Select(c => c.id_contrat));

【讨论】:

    【解决方案2】:

    public JsonResult checkForSameClient(long[] listOfContracts) {

    我能够弄清楚。 我使用了选择方法并创建了一个具有所需属性的新对象,然后我按它进行分组。

        IQueryable<ContratEspace> contrats = contratEspaceRepository.Get(1, listOfContracts.Count(), listOfContracts);
        var contratList = contrats.ToList();
    
            var answer = contrats.Select(i => new { i.id_contrat, i.id_clientGestion }).GroupBy(i=>i.id_clientGestion).ToList();
    
        return new JsonResult() { Data = answer };
    }
    

    【讨论】:

    • 这会给你 Array f Arrays of objects :[[{id_contrat1,id_clientGestion1}],[{id_contrat2, id_clientGestion2}],[{id_contrat3,id_clientGestion3}]] not [[c1.id,c4.id],[c2.id,c3.id],[c5.id]] 这不是你想要的输出
    • 我仍在努力从那里获取它 - 但它是我迄今为止最接近的。如果您有其他解决方案,请告诉我。感谢您的反馈! =)
    • 在您的Input 中有这个{client:1,id:"c1"} 是否对应于{ i.id_contrat, i.id_clientGestion }
    • 不要在 LINQ 中每次完成一个步骤时都使用ToList - 只需将这些步骤链接在一起即可。
    • 对我来说是这样的:var finalArray = list.GroupBy(c =&gt; c.client).Select(x =&gt; x.Select(y =&gt; y.id)); 这将在序列化后给你[[c1.id,c4.id],[c2.id,c3.id],[c5.id]]
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多