C# 如何从名称字符串[]创建动态LINQ select投影函数?
使用C 是否有任何方法可以从数组中为LINQ select方法上的投影函数指定属性名称C# 如何从名称字符串[]创建动态LINQ select投影函数?,c#,linq,C#,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; } } p
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<T>()
{
// Example of source
var names = new[] { "Id", "Name", "Tracks" };
var query = myDataContext.
GetTable<T>.
AsQueryable().
Select( /* dynamic projection from names array */ );
// something like
// Select(x => new
// {
// x.Id,
// x.Name,
// x.Tracks
// }
GoAndDoSomethingWith(query);
}
}
如果没有System.Linq.Dynamic,是否可以执行此操作?您可以使用反射和动态类型生成仅具有指定字段/属性的对象
public static object DynamicProjection(object input, IEnumerable<string> properties)
{
var type = input.GetType();
dynamic dObject = new ExpandoObject();
var dDict = dObject as IDictionary<string, object>;
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;
}
下面是一个简单的方法。您可以进行优化,比如为反射设置类型缓存。但这应该适用于简单的字段/属性
public static object DynamicProjection(object input, IEnumerable<string> properties)
{
var type = input.GetType();
dynamic dObject = new ExpandoObject();
var dDict = dObject as IDictionary<string, object>;
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;
}
你在这里的潜在需求是什么?显然,如果要硬编码数组,可以硬编码查询。您想实现什么?此数组只是一个示例,集合名称的来源多种多样。是的,但这不是您的基本需求。你为什么要这样做?你想干什么?驱动力是什么?