Есть ли способ передать массив строк вместо отдельных параметров в класс Entity Framework? - PullRequest
0 голосов
/ 27 мая 2020

В настоящее время у меня есть программа, которая использует OleDb для извлечения данных из таблицы Excel и импорта их в базу данных SQL Server с помощью Entity Framework.

Преодолевая разрыв между OleDb и EF, я помещаю sh данные из таблицы Excel в DataTable, go в DataTable, чтобы собрать все данные в одной строке, поместите это в StringBuilder, разделенные запятыми, а затем превратите этот StringBuilder объект в массив строк, разделенных запятыми. После этого я вызываю функцию Add для импорта данных в базу данных с помощью EF.

В коде, показанном ниже, вы можете видеть, что мне нужно вызвать

Name = data[0], Message = data[1]

et c на pu sh данные в базу данных. Есть ли способ вместо этого передать массив строк в класс вместо каждого отдельного параметра и работать с данными там?

public static void Insert(string Sheet, OleDbConnection conn)
{
        OleDbCommand command = new OleDbCommand("SELECT Name, Message, Message type FROM [" + Sheet + "$]", conn); //Selects everything inside excel file
        DataTable Data = new DataTable();

        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(Data); //Puts all data inside a DataSet

        StringBuilder sb = new StringBuilder();
        var context = new DataWarehouseContext();

        // Prints out DataSet
        foreach (DataRow dataRow in Data.Rows)
        {
            foreach (var item in dataRow.ItemArray)
            {
                sb.Append(item);
                sb.Append(",");
            }

            string[] data = sb.ToString().Split(','); //Gets data for each item in vHealth Insert method
            context.RvtoolsVHealth.Add(new RvtoolsVHealth { Name = data[0], Message = data[1], MessageType = data[2] });
            context.SaveChanges();
        }
}

Любые указатели были бы замечательными, спасибо!

1 Ответ

1 голос
/ 27 мая 2020

Не встроенным способом. Вы могли бы создать конструктор для RvtoolsVHealth, который принимает массив строк и устанавливает свойства, но, на мой взгляд, это плохой API, потому что нет способа гарантировать, что свойства сопоставлены с правильными значениями массива. Что, если массив содержит тип сообщения, сообщение и имя в указанном порядке?

То, что вы делаете, - это канонический метод создания экземпляров объектов.

Я скажу, что вы, кажется, тратите немного энергии, объединяя строку только для того, чтобы разделить ее обратно. Почему бы просто не извлечь значения из dataRow напрямую:

foreach (DataRow dataRow in Data.Rows)
{
    context.RvtoolsVHealth.Add(new RvtoolsVHealth { 
        Name        = dataRow[0].ToString(), 
        Message     = dataRow[1].ToString(), 
        MessageType = dataRow[2].ToString() 
        });
    context.SaveChanges();
}

Вы можете даже go на один шаг дальше и использовать OleDbDataReader для чтения значений вместо того, чтобы тратить время на заполнение DataTable

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