如何从字符串名称创建动态LINQ选择投影函数?

使用C#…

有没有办法从数组中为LINQ select方法指定投影函数的属性名称。

 public class Album { public int Id { get; set; } public string Name { get; set; } public short Rate { get; set; } public string Genre { get; set; } public short Tracks { get; set; } } public class Class1 { private void Some() { // Example of source var names = new[] { "Id", "Name", "Tracks" }; var query = myDataContext. GetTable. AsQueryable(). Select( /* dynamic projection from names array */ ); // something like // Select(x => new // { // x.Id, // x.Name, // x.Tracks // } GoAndDoSomethingWith(query); } } 

这可以在没有System.Linq.Dynamic情况下完成吗?

您可以使用reflection和动态类型生成仅包含指定字段/属性的对象。

以下是一种简单的方法。 您可以进行优化,例如为reflection设置类型缓存。 但这适用于简单的字段/属性。

 public static object DynamicProjection(object input, IEnumerable properties) { var type = input.GetType(); dynamic dObject = new ExpandoObject(); var dDict = dObject as IDictionary; foreach (var p in properties) { var field = type.GetField(p); if (field != null) dDict [p] = field.GetValue(input); var prop = type.GetProperty(p); if (prop != null && prop.GetIndexParameters().Length == 0) dDict[p] = prop.GetValue(input, null); } return dObject; } 

用法:

 //... var names = new[] { "Id", "Name", "Tracks" }; var projection = collection.Select(x => DynamicProjection(x, names)); //...