如何使select语句动态? LINQ

时间:2016-04-18 10:19:03

标签: c# linq

我有一个列表,其中包含每个列表项的30多个属性的数据,我正在尝试编写一个Linq查询,它将在列表上执行操作。

我的每个列表项的属性都是名称,地点,年龄等,所以如果我想过滤我的列表以选择特定的列数据,如名称或地点或任何组合。

静态查询:

(from data in myList select new {DName = data.Name,myPlace= data.Place}).ToList();

所以我希望select部分动态。所有我需要的列信息我将存储在数组

示例:

var arr = new [] {'Name','Age'} // this will change 

如何在lInq中使用我的列数组来过滤数据。

2 个答案:

答案 0 :(得分:1)

您可以尝试动态LINQ,这是Microsoft在其中一个示例中介绍的概念。有几个Nuget包(例如https://www.nuget.org/packages/System.Linq.Dynamic/)。基本上,不是强类型表达式,而是字符串。你可以在这里找到一篇关于它的帖子:https://weblogs.asp.net/ricardoperes/dynamic-linq

答案 1 :(得分:1)

您可以使用ExpandoObject并添加字符串数组作为其属性 您应该声明新的ExpandoObject并将其强制转换为IDictionary<String,Object>,然后使用反射和字符串数组中的属性名称获取数据行的每个属性。最后将属性名称及其值添加到已转换字典中。

例如:

//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