Linq选择动态属性列表到另一个对象中?

3

我有一个属性列表,它将是动态的,并且可能在每个请求中频繁更改。

var dynamicFields = new List<string>{ "UserName", "UserEmail" }; 

我有另一个类别列表,其中包含所有动态字段和其他字段。

var staticFields = new List<StaticFields>
    {
        new StaticFields {UserName = "Chandra", UserDepartment = "IT", UserCity = "Bangalore", UserEmail = "abc@gmail.com"},
        new StaticFields {UserName = "Sekar", UserDepartment = "CSE", UserCity = "Bangalore", UserEmail = "xyz@gmail.com"},
        new StaticFields {UserName = "Dilip", UserDepartment = "IT", UserCity = "Bangalore", UserEmail = "cba@gmail.com"}
    };

public class StaticFields
{
    public string UserName {get; set;}
    public string UserDepartment {get; set;}
    public string UserCity {get; set;}
    public string UserEmail {get; set;}
    //etc..
}

--

我需要仅选择在dynamicFields列表中的字段。

那么我怎样才能在C#中实现这个功能?可以使用for循环或者使用LINQ。

编辑:

目的是只显示所选列的内容,我正在使用SP从数据库中提取所有数据。它是来自数据库的遗留代码,因此我无法访问修改DB存储过程的任何内容。

我已经尝试了以下JS代码。

var i;
var properties = [
 'UserName',
 'UserEmail'
];
for (i = 0; i < properties.length; i += 1) {
 document.writeln(properties[i] + ': ' + another_object[properties[i]]);
}

我需要将这段代码转换成C#语言


你到目前为止尝试了什么? - CSharpie
你实际上要用它们做什么?很有可能你会使用反射来完成这个任务,但这可能会效率低下,并且可能会超出你所需的范围(例如获取属性,然后获取非默认值的值)。 - Sayse
你为什么只想选择特定的列?是为了减少查询负荷还是只需要显示特定的列?另外,请展示一下你尝试过但还没有完整的代码。 - Yuliam Chandra
嗨,我已经更新了目的和迄今为止所做的事情。 - Chandu
我猜你正在使用某种数据网格,并且只想显示特定的列。为此,你可以使用许多方法,例如包装器对象、自动生成列或使用可浏览属性。 - Rand Random
那么您期望的结果是一个匿名类型的列表,可以从类似于 result[i]["UserName"] 的东西中访问吗? - Yuliam Chandra
1个回答

5
你可以使用适当的扩展和动态LINQ
public static T GetValue<T>(this DynamicClass dynamicObject, string propName)
{
    if (dynamicObject == null)
    {
        throw new ArgumentNullException("dynamicObject");
    }

    var type = dynamicObject.GetType();
    var props = type.GetProperties(BindingFlags.Public 
                                 | BindingFlags.Instance 
                                 | BindingFlags.FlattenHierarchy);
    var prop = props.FirstOrDefault(property => property.Name == propName);
    if (prop == null)
    {
        throw new InvalidOperationException("Specified property doesn't exist.");
    }

    return (T)prop.GetValue(dynamicObject, null);
}

public static string ToDynamicSelector(this IList<string> propNames)
{
   if (!propNames.Any()) 
       throw new ArgumentException("You need supply at least one property");
   return string.Format("new({0})", string.Join(",", propNames));
}

然后您可以像这样使用它:
using System.Linq.Dynamic;
...

var result = staticFields.AsQueryable().Select(dynamicFields.ToDynamicSelector())
                                       .Cast<DynamicClass>();

foreach (var item in result)
{
    Console.WriteLine(item.GetValue<string>(list[0]); // outputs all user names
}

备注:

  1. 动态LINQ支持EF,因此您可以直接从数据库获取数据
  2. 您可以将result序列化为JSON而不会遇到任何问题 - DynamicClass已经构建了属性。

谢谢,它正在工作。也感谢您的评论。我正在尝试。 - Chandu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接