【问题标题】:GroupBy with different parameters具有不同参数的 GroupBy
【发布时间】:2020-04-21 08:34:34
【问题描述】:

我有一个带有groupBy 参数的查询取决于用户输入。如果条件为真,查询将与DOB 属性分组。否则,它不需要。 这是我的代码

   var userList = user.GroupBy(x => new { x.Name, x.Age});
       if (isBaby)
       {
          userList = user.GroupBy(x => new { x.Name, x.Age, x.DOB });
       }

但是我得到一个参数不一样的错误。后面的代码就是这样从这个查询中选择的。

     var allList= userList.Select({ 
        ...
       }).ToList();

我不想创建两个select 列表,因为如果只使用一个select 列表更容易管理。

编辑: 这是错误

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<SystemLinq.IGrouping<<anonymous type: string name, string age>, Domains.User>>' to 'System.Collections.Generic.IEnumerable<SystemLinq.IGrouping<<anonymous type: string name, string age, string DOB>, Domains.User>>'

在此处输入代码

【问题讨论】:

  • 能否请您附上错误信息?
  • 关于错误,你为什么不这样做:` if (isBaby){ var userList = user.GroupBy(x => new { x.Name, x.Age, x.DOB } );} else{ var userList = user.GroupBy(x => new { x.Name, x.Age});}`
  • @fyrz 您正在尝试对已经分组的列表进行分组` if (isBaby) { userList = user.GroupBy(x => new { x.Name, x.Age, x.DOB }); } else { user.GroupBy(x => new { x.Name, x.Age}); }`
  • 但是我不能在 if else 语句之外使用 var userList

标签: c# list linq model-view-controller group-by


【解决方案1】:

假设DOBDateTime

var userList = user.GroupBy(x => new { x.Name, x.Age, dob = isBaby ? x.DOB : DateTime.MinValue });

这样表达式始终是同一类型,但不会在 isBaby 为 false 时导致额外的分组层。

【讨论】:

  • 我试过这个。但是当 isBaby 为 false 时,它​​仍然对 DateTime.MinValue 进行分组
  • 是的,但它不会影响分组,即您将在结果中拥有相同数量的组。
  • 但我想将其显示为列表。如果列表有 5 行,我想显示所有行而不是一个。
  • @fyrz 我不确定你的意思。您可以在问题中添加示例输入和预期输出吗?
  • 没关系,我将使用此解决方案并更改其他代码。但是我可以用 DateTime.Now 替换 DateTime.MinValue 吗?因为我无法将值保存在数据库中。
【解决方案2】:

嗯,你在组中构造了两个不同的结果...

Var 隐式尝试假定类型,第一个赋值是只有 Name 和 Age 的匿名类型。第二个添加了 DOB,这是一种不同的匿名类型。

有点像

new { x.Name, x.Age, DateOfBirth = isBaby ? x.DOB : DateTime.MinValue }

会解决的

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多