我有一个列表,其中包含每个列表项的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中使用我的列数组来过滤数据。
答案 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