我试图创建一个csv导出器,从我们的数据库导出模型到csv文件。作为一项要求,对于每次导出,用户都能够选择需要导出模型的哪些属性。
是否可能返回一个只包含所选属性的匿名类型,其中属性是由用户选择的,因此不知道
示例数据类:
public class Location
{
public Location() { }
public int Id { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string State { get; set; }
}
手动的例子:
public IActionResult GetSelectProperties()
{
var locations = new List<Location>(); // Assume a filled list
return new JsonResult(locations.Select(x => new {x.Name, x.City}));
}
理想(不完全)溶液
public IActionResult GetSelectProperties2()
{
var locations = new List<Location>();
var properties = new List<string>() { "Name", "City" };
return new JsonResult(locations.Select(x => { < where x in properties ?> }));
}
我已经尝试使用反射
var property = typeof(Location).GetProperty("Name");
但是不知道如何在LINQ查询中组合PropertyInfo
您不能为此使用匿名类型,因为它们的属性必须在编译时声明,但是您可以使用字典:
return new JsonResult(
locations.Select(location => properties.ToDictionary(
property => property,
property => typeof(Location).GetProperty(property).GetValue(location))));
如果您事先知道模型,那么使用反射将很容易。在您的案例中,您正在按需生成模型。您是否使用ADO.net或任何特定的SDK?如果你可以迭代数据库模式,那么这将是最好的方法。