【问题标题】:Selecting Column Name In Linq By Text在 Linq 中按文本选择列名
【发布时间】:2015-09-25 15:28:14
【问题描述】:

我正在开发一个具有绘图工具的网站,该工具允许用户选择最多 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"});

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

【问题讨论】:

  • 您可以通过Reflection 进行此操作。
  • 正如其他人所提到的,Reflection 是您在这里寻找的。但你应该知道reflection is an expensive operation,在这种情况下,它看起来可能真的会影响你的表现。
  • 我发布了一个答案,如果它解决了你的问题,请告诉我。

标签: c# asp.net-mvc linq


【解决方案1】:

不是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);

【讨论】:

    【解决方案2】:

    使用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)});
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多