将静态列添加到动态 LINQ 查询

Posted

技术标签:

【中文标题】将静态列添加到动态 LINQ 查询【英文标题】:Add static column to Dynamic LINQ query 【发布时间】: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 循环中一样修改它们的值?

【问题讨论】:

【参考方案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 可能会导致性能问题。

【讨论】:

以上是关于将静态列添加到动态 LINQ 查询的主要内容,如果未能解决你的问题,请参考以下文章

C# 静态类如何赋值,LINQ有关。

将具有随机生成的假数据的动态数据帧转换为静态数据帧

如何在dataTable现有列中添加静态数据列

如何MyBatis中使用动态SQL查询与注释

如何将qt静态库代码还原动态库

动态语言静态化