如何使select语句动态?林克
本文关键字:林克 动态 语句 何使 select | 更新日期: 2024-09-25 22:29:51
我有一个列表,每个列表项的数据大约有30多个属性,我正在尝试编写一个Linq查询,它将对列表进行操作。
我的属性每个列表项都是Name、place、Age等,所以如果我想过滤我的列表以选择特定的列数据,比如只选择Name或place或任何组合,该怎么办。
静态查询:
(from data in myList select new {DName = data.Name,myPlace= data.Place}).ToList();
所以我希望使select
部分具有动态性。所有我需要的列信息我将存储在阵列中
示例:
var arr = new [] {'Name','Age'} // this will change
关于如何在lInq中使用我的列数组来过滤数据的想法。
您可以尝试Dynamic LINQ,这是Microsoft在其示例中引入的一个概念。存在若干Nuget包(例如。,https://www.nuget.org/packages/System.Linq.Dynamic/)。基本上,您使用的不是强类型表达式,而是字符串。你可以在这里找到关于它的帖子:https://weblogs.asp.net/ricardoperes/dynamic-linq.
您可以使用ExpandoObject并添加字符串数组作为其属性
您应该声明新的ExpandoObject
并将其强制转换为IDictionary<String,Object>
,然后使用反射和字符串数组中的属性名称获取数据行的每个属性。最后将属性名称及其值添加到casted字典中。
示例:
//initialize DataSource
var myList = Enumerable.Range(0, 10).Select (i=> new { Name = "abc", Place = "def" }).ToList();
//initialize array of properties
var properties = new string[] { "Name", "Place" };
var result = myList.Select(data =>
{
dynamic r = new System.Dynamic.ExpandoObject();
properties.AsParallel().ForAll(
p => (r as IDictionary<string, object>).Add(p,
data.GetType().GetProperty(p).GetValue(data, null)));
return r;
});
Console.WriteLine(result.Last().Place); //def