如何使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中使用我的列数组来过滤数据的想法。

如何使select语句动态?林克

您可以尝试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