通过文本在Linq中选择列名

本文关键字:选择 Linq 文本 | 更新日期: 2023-09-27 18:14:26

我正在一个网站上工作,该网站具有绘图工具,允许用户选择3个属性以显示在图形上。

我有一个结构类似于以下的数据库:

public class MyClass
{
    public decimal Field1 {get;set;}
    public decimal Field2 {get;set;}
    ...
    public decimal Field10 {get;set;}
}

我需要用户能够选择最多3个属性,然后在一个对象中返回。

public class MyResult
{
    public decimal value1 {get;set;}
    public decimal value2 {get;set;}
    public decimal value3 {get;set;}
}

该网站包含三个下拉框,用户可以从10个字段中选择他们想要绘制为value1、2或3的字段。

因此,传入控制器的值将是一个详细说明列名的字符串,但是由于Linq是强类型的,这两者不能互换。

如何编写一个不是强类型的Linq命令,而是使用用户传入的文本作为列名?

下面的内容是理想的,但是行不通。

values.Select(x => new MyResult(){ value1 = "Field1", value2 = "Field5", value3 = "Field9"});

或者我只是看这个完全错误的方式?有没有更好的方法来实现这一点?

通过文本在Linq中选择列名

这不是LinQ,但您可以考虑使用AutoMapper,它在这种情况下非常方便。

示例:

 Mapper.CreateMap<MyClass, MyResult>()
                .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.Value1))
                .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.Value2))
                .ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.Value3))

之后你可以调用:

MyResult result = Mapper.Map<MyClass>(class);

使用Reflection,您可以获得具有其名称的类的属性值。下面是代码:

public object GetPropertyOfMyClass(string propertyName, MyClass instance)
{
    System.Reflection.PropertyInfo[] properties = typeof(MyClass).GetProperties();
    return properties.Single(i => i.Name == propertyName).GetValue(instance);
}

然后像这样使用:

values.Select(x => new MyResult(){ 
                   value1 =  (decimal)GetPropertyOfMyClass("Field1",x),
                   value2 =  (decimal)GetPropertyOfMyClass("Field5",x),
                   value3 =  (decimal)GetPropertyOfMyClass("Field9".x)});