【问题标题】:Dynamic properties in LINQ queryLINQ 查询中的动态属性
【发布时间】:2014-09-20 23:55:35
【问题描述】:

我正在尝试将复杂的域模型转换为 CSV 格式。然而,模型的动态结构将我的 LINQ 魔法推到了极限:)

所需的结果应如下所示。一个标题行,然后是数据行。 请注意,有些字段是空的,有些则有多个。

输出

PropA;RolenameA;RolenameB;RolenameC
123;username1,username2;username1;username2
321;;;username1

我希望创建一个 LINQ 查询,它可以动态地为每个角色添加属性,然后用正确的用户名填充该属性。 我认识到标题和数据必须在 2 个不同的语句中。

伪代码

var result = new { "PropA", Roles.ForEach(x => x.Rolename) }
result += query.Select(x => new { x.PropA, x.UserRoles.ForEach(...) });

我试图用 LINQ 做的事情是不可能的,我应该用动态对象“手动”做,还是我需要学习一些黑魔法:)?

型号

public class A
{
    public int PropA { get; set; }
    public IEnumerable<UserRole> UserRoles { get; set; }
}

public class UserRole
{
    public Role Role { get; set; }
    public User User { get; set; }
}

public class Role
{
    public string Rolename { get; set; }
}

public class User
{
    public string Username { get; set; }
}

【问题讨论】:

  • 我之前使用dynamic linq 库取得了一些成功
  • 仍然不确定我是否理解。会有其他属性吗,比如propB?那会怎么样?
  • 你可以通过拥有类(PropA,Role)然后导出到 Excel 数据透视表,其中行是 PropA,列是角色,数据将被计数
  • 是的,还会有其他属性。它们将像 A.PropB 一样添加到 A。 CSV 输出中的 PropBs 顺序将由动态对象控制。这意味着第一个道具将是第 1 列,接下来是第 2 列等等。

标签: c# linq


【解决方案1】:

我最终使用 ExpandoObject “手动”完成。

foreach (var item in items)
{
    var obj = new ExpandoObject() as IDictionary<string, Object>;
    obj.Add("PropA", item.PropA);

    foreach (var role in roles)
    {
        obj.Add(role.Name,
                String.Join(",", item.UserRole.Where(x => x.Role == role).Select(x => x.User.Name)));
    }
    // omitted...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多