【问题标题】:LINQ Group By with IF statementLINQ Group By with IF 语句
【发布时间】:2014-03-30 17:17:25
【问题描述】:

我有一个可供具有多个角色的用户访问的页面。角色是:

i) 城镇 ii) 区 iii) 国家

如果用户具有“城镇”角色,则他与城镇相关联,例如洛杉矶。如果用户具有“地区”角色,则他与地区相关联,例如加利福尼亚。如果用户具有“国家”角色,则他与国家相关联,例如美国。

现在我知道洛杉矶不是一个城镇而是一个城市,而加利福尼亚不是一个地区而是一个州。我只是给出这些例子来帮助你理解数据的结构。

每个角色可以查看多个文档。文档与某个部分相关,例如财务、基础设施等

现在,我有一个从数据库中获取全部数据的 SP。然后我想使用 LINQ 对数据进行分组。我想做这样的事情:

GROUP BY Role
             --> GROUP BY Section
                                --> GROUP BY Document
                                                   --> IF ROLE is Town --> GROUP BY Town (e.g. Los Angeles)
                                                   --> IF ROLE is District --> GROUP BY District (e.g. California)
                                                   --> IF ROLE is Country --> GROUP BY Country (e.g. USA)

是否可以使用 LINQ 包含 if 语句的最后一部分?如果是的话,你能给我一个简短的语法例子吗?我正在使用查询语法。提前谢谢你。

【问题讨论】:

  • 你不能在三个单独的查询中获取数据吗?这会让事情变得更简单。
  • 我也同意@JonSkeet。只需编写 3 个查询,然后合并结果。
  • 谢谢 JonSkeet 和 kayson。仔细想想,我认为这是最好的方法。出于好奇,是否可以在 LINQ 中执行包含 if 语句的最后一部分?

标签: c# sql linq


【解决方案1】:

您可以使用继承自 Role 的类(城镇、国家和州)

public enum typeRoleEnum
{
   country = 0,
   state = 1,
   town = 2
}

public class Role {
    public string name { get; set; }
    public typeRoleEnum type { get; set; }
}
public class Town: Role {}
public class District : Role { }
public class Country : Role { }

name in Role 是每个类通用的属性,包含州、城镇或国家的名称。只有在这样的属性上,您才会按分组。

比你创建一个这样的对象列表

List<Role> list = new List<Role>();

Role rol1 = new Town() { name = "Town1", type = typeRoleEnum.town  }; 
Role rol2 = new Town() { name = "Town2", type = typeRoleEnum.town  };
Role rol3 = new Town() { name = "Town2", type = typeRoleEnum.town  };

list.Add(rol1);
list.Add(rol2);
list.Add(rol3);

在这里您必须知道您正在创建的类型列表 查询将是

var t = from l in list
    group l by l.name into grp
select grp.Key;

可能在这种情况下,您有一个查询,但 if 语句位于代码的其他位置,此时您必须创建列表

你可以只使用角色类型的类吗?这可能是一个更好的解决方案,除非这三个类必须具有不同的行为并且您只想按共同属性进行分组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多