将静态列添加到动态 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 查询的主要内容,如果未能解决你的问题,请参考以下文章