Выбрать столбцы из таблицы на основе имен столбцов из другой таблицы - PullRequest
1 голос
/ 04 июля 2019

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

Я реализовал функцию, которая позволяет пользователю выбирать столбцы, которые он хочет видеть.

Я создал хранимую процедуру, которая получает все имена столбцов из таблицы UserColumns, создает динамический SQL-запрос и затем запускает запрос exec (@command). Описанные выше функции работают очень хорошо, но есть и другие требования, с которыми я не справлюсь.

Есть TasksViewModel:

public class TasksViewModel
{
    public List<Dictionary<List<string>, List<List<object>>>> Tasks { get; set; }

    public List<UserDefaultStatusesViewModel> UserStatuses { get; set; }

    public List<ZgloszenieStatus> TaskStatuses { get; set; }

    public TasksViewModel()
    {

    }
}

Tasks заполняется хранимой процедурой, выполняющей запрос SELECT x,y,z... FROM table....

Я использую этот метод:

private static IEnumerable<Dictionary<List<string>, List<List<object>>>> Read(DbDataReader reader)
    {
        var dict = new Dictionary<List<string>, List<List<object>>>();

        var cols = new List<string>();

        for (int temp = 0; temp < reader.FieldCount; temp++)
        {
            cols.Add(reader.GetName(temp));
        }

        var items = new List<List<object>>();

        while (reader.Read())
        {
            var tmp = new List<object>();

            for (int i = 0; i < reader.FieldCount; i++)
            {
                tmp.Add(reader.GetValue(i));
            }

            items.Add(tmp);

        }

        dict.Add(cols, items);

        foreach (var item in dict)
        {

        }

        yield return dict;
    }

Я нахожу это очень сложным, но в настоящий момент я понятия не имею, есть ли другой способ сделать это.

Я использую Entity Framework в своем приложении.

Представьте, что я использую List<Tasks> вместо List<Dictionary<List<string>, List<List<object>>>>. Tasks является таблицей базы данных.

public class Tasks
{
    public int ID { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }

    public DateTime Date { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Пользователь хочет видеть только ID,Title,Description столбцы, поэтому таблица UserColumns выглядит следующим образом:

UserId | ColumnName
  1    |      ID
  2    |    Title
  3    |    Description

Есть ли способ выбрать определенные столбцы из List<Tasks> на основе таблицы UserColumns с использованием Entity Framework?

1 Ответ

0 голосов
/ 04 июля 2019

Вы можете динамически создать лямбду для списка столбцов

static Func<Tasks, Tasks> CreateSelect(string[] columns)
{
    var parameterExpression = Expression.Parameter(typeof(Tasks), "p");
    var newExpression = Expression.New(typeof(Tasks));

    var bindings = columns.Select(o => o.Trim())
        .Select(o =>
        {
            var pi = typeof(Tasks).GetProperty(o);
            var memberExpression = Expression.Property(parameterExpression, pi);
            return Expression.Bind(pi, memberExpression);
        }
    );
    var memberInitExpression = Expression.MemberInit(newExpression, bindings);
    var lambda = Expression.Lambda<Func<Tasks, Tasks>>(memberInitExpression, parameterExpression);
    return lambda.Compile();
}

и создайте запрос LINQ на основе этой лямбды (массив columnNameList представляет собой строки из таблицы UserColumns)

static void Foo()
{
    var columnNameList = new string[] { "ID", "Title", "Description" };
    var tasksList = new List<Tasks>
    {
        new Tasks{ ID=1, Title="T1", FirstName="F1", LastName="L1", Description="D1", Date=DateTime.UtcNow },
        new Tasks{ ID=2, Title="T2", FirstName="F2", LastName="L2", Description="D2", Date=DateTime.UtcNow }
    };

    var tasks = tasksList.Select(CreateSelect(columnNameList)).FirstOrDefault();
}

Надеюсь, это ответит на ваш вопрос.

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