2015-09-24 7 views
1

Я работаю над веб-сайтом с графическим инструментом, позволяющим пользователю выбирать до 3 свойств, отображаемых на графике.Выбор имени столбца в Linq по тексту

меня есть база данных со структурой, подобные следующим:

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"}); 

Или я просто смотрю на это совершенно неправильно? Есть ли лучший способ достичь этого?

+0

Вы можете сделать это с помощью 'Reflection'. –

+0

Как уже упоминалось, «Отражение» - это то, что вы ищете здесь. Но вы должны знать, что [отражение - дорогостоящая операция] (http://stackoverflow.com/questions/25458/how-costly-is-net-reflection), и в этом случае похоже, что это может действительно убить вашу производительность. – ethorn10

+0

Я отправляю ответ, дайте мне знать, если он решает вашу проблему. –

ответ

1

Используя 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)}); 
2

Это не 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); 
Смежные вопросы