【问题标题】:Add static column to Dynamic LINQ query将静态列添加到动态 LINQ 查询
【发布时间】:2021-12-03 03:21:32
【问题描述】:

在我的项目中,我使用 Dynaic LINQ (https://dynamic-linq.net/) 从数据库中选择数据。这是我当前的选择代码:

List<dynamic> clientData = await clientDataset
    .Select($"new({string.Join(",", requiredColumns)})")
    .ToDynamicListAsync();

我需要扩展它。在客户端的后续步骤中,我必须向 clientData 对象添加其他属性。据我所知,这是不可能的。以下方法不起作用:

foreach (dynamic listEntry in clientData)
{
    listEntry["MyAdditionalProp1"] = GetStringValue1();
    listEntry["MyAdditionalProp2"] = GetStringValue2();
}

所以我想在 select 语句中将它们添加为假列,这也不起作用。

List<dynamic> clientData = await clientDataset
    .Select($"new({string.Join(",", requiredColumns)},'' AS MyAdditionalProp1, '' AS MyAdditionalProp2)")
    .ToDynamicListAsync();

附加属性的名称(MyAdditionalProp1、MyAdditionalProp1、...)在选择之前是已知的,但它们是动态的,因此我无法对它们进行硬编码。

如何将动态属性添加到我的列表中并像在 foreach 循环中一样修改它们的值?

【问题讨论】:

    标签: c# linq dynamic dynamic-linq


    【解决方案1】:

    由于动态 LINQ 在运行时基于 string 新表达式创建匿名类型,因此一旦创建,您就无法向对象添加属性。

    所以您确实需要将属性添加到新表达式中:

    List<dynamic> clientData = await clientDataset
        .Select($"new({string.Join(",", requiredColumns)},\"\" AS MyAdditionalProp1, \"\" AS MyAdditionalProp2)")
        .ToDynamicListAsync();
    

    那么,由于你不知道运行时的属性名称,你必须使用库提供的辅助函数:

    foreach (dynamic listEntry in clientData) {
        listEntry.SetDynamicPropertyValue("MyAdditionalProp1", GetStringValue1());
        listEntry.SetDynamicPropertyValue("MyAdditionalProp2", GetStringValue2());
    }
    

    您可以使用GetDynamicPropertyValue() 访问属性值。

    注意:大量使用 dynamic 可能会导致性能问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2012-06-10
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多