Как получить определенные c свойства из объекта на основе имен свойств, выбранных во время выполнения - PullRequest
0 голосов
/ 10 июля 2020

У меня есть класс, скажем:

 public class Quote {

 public string City { get; set; }
 public string State { get; set; }
 string ZipCode { get; set; }
 public string HomeValue { get; set; }

}

Затем я отображаю каждое имя свойства на странице с флажком рядом с ним. Допустим, выбраны City и HomeValue. Теперь, когда я запрашиваю таблицу базы данных «Цитата», я получаю все данные по ней, мне нужно отфильтровать эти данные и отобразить в результатах на странице только выбранные свойства с соответствующими значениями ... Как сопоставить свойство имена из данных, которые я получил из базы данных, на имена, которые были выбраны ... Ожидаемые результаты для приведенного выше примера будут:

City          HomeValue
Atlanta       234000
Orlando       435032

//All of the other values but just for `City` and `HomeValue` properties

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Вы можете использовать отражение для получения свойств и их значений. Проверьте следующие фрагменты кода.

Модели:

public class Quote
{
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string HomeValue { get; set; }
}

public class QuotesModel
{
    public List<Dictionary<string, object>> Quotes { get; set; }
    public string[] SelectedProps { get; set; } = AllProps;

    public static readonly string[] AllProps;
    static QuotesModel()
    {
        AllProps = typeof(Quote).GetProperties().Select(pi => pi.Name).ToArray();
    }
}

Контроллер / Действие :

...
[HttpGet]
public IActionResult Quotes([FromQuery] IList<string> props = null)
{
    if (props == null || !props.Any())
    {
        props = QuotesModel.AllProps;
    }

    var quotes = FetchQuotes();

    //--apply properties filter
    var selectedPropInfo = typeof(Quote).GetProperties().Where(p => props.Contains(p.Name)).ToList();

    var filteredQuotes = quotes
        .Select(quote => selectedPropInfo.ToDictionary(pi => pi.Name, pi => pi.GetValue(quote)))
        .ToList();

    var model = new QuotesModel
    {
        Quotes = filteredQuotes,
        SelectedProps = props.ToArray()
    };

    return View(model);
}
...

Для отображения отфильтрованных объектов:

<table>
    <thead>
        <tr>
            @foreach (var prop in Model.SelectedProps)
            {
                @:<td>@prop</td>
            }
        </tr>
    </thead>
    <tbody>
        @foreach (var q in Model.Quotes)
        {
            <tr>
                @foreach (var prop in Model.SelectedProps)
                {
                    <td>@q[prop]</td>
                }
            </tr>
        }
    </tbody>
</table>
0 голосов
/ 10 июля 2020

Ваш вопрос должен быть более ясным. Но если вы пытаетесь загрузить данные из базы данных и сопоставить их со свойствами вашего класса Quote, не изобретайте велосипед. Используйте Dapper:

var sql = "SELECT * FROM Quote";
using (var connection = new SqlConnection("..."))
{
   var quotes = connection.Query<Quote>(sql).ToList();
   // logic to process a List<Quote>
   ...
}

Ссылка: https://stackexchange.github.io/Dapper/

Популярные руководства: https://dapper-tutorial.net/

Если только точно столбцы должны быть загружены из базы данных, тогда вместо «*» вам нужно объединить имена столбцов, возможно, используя StringBuilder. Зависит от того, что вы получите после того, как пользователь установит эти флажки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...