Herman<T>.Instance Ответов: 1

Отображение enitity на основе массива


У меня есть сущность EF (основанная на таблице), которая содержит имена столбцов, такие как var1, var2, var3
Как я могу очень просто сопоставить свойства row[0], row[1], row[2]. Где row - это DataRow.
Моя самая большая проблема заключается в том, что объект Datatable не всегда имеет одинаковое количество столбцов.

Мой код:
private void AddExcelDataToEF()
        {
            string[] columnNames = _data.Columns.Cast<DataColumn>()
                                 .Select(x => x.ColumnName)
                                 .ToArray();
            using (var db = new Entities())
            {
                foreach (DataRow row in _data.Rows)
                {
                    var inputFile = new GL_InputTable();
                    inputFile.inputLineStatusID = 0;
                    inputFile.isDeleted = false;
                    inputFile.sourceFileID = _sourceFileID;
                    inputFile.lastModifiedBy = 0;
                    for (int lineNr = 0; lineNr < columnNames.Length; lineNr++)
                    {
                        switch (lineNr)
                        {
                            case 0: inputFile.lab1 = columnNames[lineNr]; inputFile.var1 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 1: inputFile.lab2 = columnNames[lineNr]; inputFile.var2 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 2: inputFile.lab3 = columnNames[lineNr]; inputFile.var3 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 3: inputFile.lab4 = columnNames[lineNr]; inputFile.var4 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 4: inputFile.lab5 = columnNames[lineNr]; inputFile.var5 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 5: inputFile.lab6 = columnNames[lineNr]; inputFile.var6 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 6: inputFile.lab7 = columnNames[lineNr]; inputFile.var7 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 7: inputFile.lab8 = columnNames[lineNr]; inputFile.var8 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 8: inputFile.lab9 = columnNames[lineNr]; inputFile.var9 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 9: inputFile.lab10 = columnNames[lineNr]; inputFile.var10 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 10: inputFile.lab11 = columnNames[lineNr]; inputFile.var11 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 11: inputFile.lab12 = columnNames[lineNr]; inputFile.var12 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 12: inputFile.lab13 = columnNames[lineNr]; inputFile.var13 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 13: inputFile.lab14 = columnNames[lineNr]; inputFile.var14 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 14: inputFile.lab15 = columnNames[lineNr]; inputFile.var15 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 15: inputFile.lab16 = columnNames[lineNr]; inputFile.var16 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 16: inputFile.lab17 = columnNames[lineNr]; inputFile.var17 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 17: inputFile.lab18 = columnNames[lineNr]; inputFile.var18 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 18: inputFile.lab19 = columnNames[lineNr]; inputFile.var19 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 19: inputFile.lab20 = columnNames[lineNr]; inputFile.var20 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 20: inputFile.lab21 = columnNames[lineNr]; inputFile.var21 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 21: inputFile.lab22 = columnNames[lineNr]; inputFile.var22 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 22: inputFile.lab23 = columnNames[lineNr]; inputFile.var23 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 23: inputFile.lab24 = columnNames[lineNr]; inputFile.var24 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 24: inputFile.lab25 = columnNames[lineNr]; inputFile.var25 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 25: inputFile.lab26 = columnNames[lineNr]; inputFile.var26 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 26: inputFile.lab27 = columnNames[lineNr]; inputFile.var27 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 27: inputFile.lab28 = columnNames[lineNr]; inputFile.var28 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 28: inputFile.lab29 = columnNames[lineNr]; inputFile.var29 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 29: inputFile.lab30 = columnNames[lineNr]; inputFile.var30 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 30: inputFile.lab31 = columnNames[lineNr]; inputFile.var31 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 31: inputFile.lab32 = columnNames[lineNr]; inputFile.var32 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 32: inputFile.lab33 = columnNames[lineNr]; inputFile.var33 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 33: inputFile.lab34 = columnNames[lineNr]; inputFile.var34 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 34: inputFile.lab35 = columnNames[lineNr]; inputFile.var35 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 35: inputFile.lab36 = columnNames[lineNr]; inputFile.var36 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 36: inputFile.lab37 = columnNames[lineNr]; inputFile.var37 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 37: inputFile.lab38 = columnNames[lineNr]; inputFile.var38 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 38: inputFile.lab39 = columnNames[lineNr]; inputFile.var39 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 39: inputFile.lab40 = columnNames[lineNr]; inputFile.var40 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 40: inputFile.lab41 = columnNames[lineNr]; inputFile.var41 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 41: inputFile.lab42 = columnNames[lineNr]; inputFile.var42 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 42: inputFile.lab43 = columnNames[lineNr]; inputFile.var43 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 43: inputFile.lab44 = columnNames[lineNr]; inputFile.var44 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 44: inputFile.lab45 = columnNames[lineNr]; inputFile.var45 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 45: inputFile.lab46 = columnNames[lineNr]; inputFile.var46 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 46: inputFile.lab47 = columnNames[lineNr]; inputFile.var47 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 47: inputFile.lab48 = columnNames[lineNr]; inputFile.var48 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 48: inputFile.lab49 = columnNames[lineNr]; inputFile.var49 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 49: inputFile.lab50 = columnNames[lineNr]; inputFile.var50 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 50: inputFile.lab51 = columnNames[lineNr]; inputFile.var51 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 51: inputFile.lab52 = columnNames[lineNr]; inputFile.var52 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 52: inputFile.lab53 = columnNames[lineNr]; inputFile.var53 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 53: inputFile.lab54 = columnNames[lineNr]; inputFile.var54 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 54: inputFile.lab55 = columnNames[lineNr]; inputFile.var55 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 55: inputFile.lab56 = columnNames[lineNr]; inputFile.var56 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 56: inputFile.lab57 = columnNames[lineNr]; inputFile.var57 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 57: inputFile.lab58 = columnNames[lineNr]; inputFile.var58 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 58: inputFile.lab59 = columnNames[lineNr]; inputFile.var59 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            case 59: inputFile.lab60 = columnNames[lineNr]; inputFile.var60 = row[lineNr] == DBNull.Value ? null : row[lineNr].ToString(); break;
                            default: break;
                        }
                    }
                    db.GL_InputTable.Add(inputFile);
                }
                db.SaveChanges();
            }
        }


Что я уже пробовал:

Не могу понять, как решить эту проблему простым стратегическим способом.
Мне не нужен оператор switch case с 60 случаями !!

GKP1992

Привет дигиманус,

Можете ли вы привести пример, чтобы прояснить проблему?

Спасибо.

Herman&lt;T&gt;.Instance

Добавлен кодовый бит

GKP1992

Спасибо за подробности. Можете ли вы также поделиться структурой таблицы, я не уверен, зачем вам нужны имена столбцов во входном файле. Если они будут основываться на количестве столбцов в файле excel, почему бы не обновить столбцы последовательно, используя цикл foreach, а остальные обновить с помощью нулей?

Herman&lt;T&gt;.Instance

хорошо.. файл ввода сущности - это структура таблицы.
Дело в том, что мое приложение получает файл EXCEL. Затем считывается конкретный рабочий лист, и значения преобразуются в объект DATATABLE. Вот почему я знаю только то, что невозможно иметь более 60 колонок. Но сколько может быть разных.
Поэтому я надеялся найти способ, который на основе количества столбцов каждого значения datarow должен быть сопоставлен с полем в таблице. Так что столбцы, которых у меня нет, остаются нулевыми.

GKP1992

Привет дигиманус,

Это не так просто, как кажется, но, насколько я могу понять вашу проблему,вы можете воспользоваться методами Take и Range класса Enumerable. Используйте имена столбцов.Подсчитайте, чтобы взять коллекцию лабораторий и VAR и обновить их, используя a для каждого.

Надеюсь, это поможет.

Herman&lt;T&gt;.Instance

Спасибо за подсказку. Я займусь расследованием.

GKP1992

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

1 Ответов

Рейтинг:
12

Thomas Nielsen - getCore

Это немного грубо и может потребовать проверки som nullchecking но это должно сработать :)

public class RowMapper
    {
        /*
            The way i read your sample is you get a datatable with columns and rows, 
            these are to be mapped to an entity which presumably doesn't require all columns filled.
            Those datatables however can have different set of columns defined.

            GL_InputTable entity apparently contains the columns 'var1' to 'var60' and 'lab1' to 'lab60'
         * */

        public void AddToDb(DataTable dataTable)
        {
            using (var db = new Entities())
            {
                for (int idx = 0; idx < dataTable.Rows.Count; idx++)
                {
                    GL_InputTableRow newrow;
                    GetMapAblesInRow(dataTable, idx, out newrow);
                    db.GL_InputTable.Add(newrow);
                }
                db.SaveChanges();
            }
        }

        private void GetMapAblesInRow(DataTable dataTable, int idxRow, out GL_InputTableRow outEntityTableRow)
        {
            var efTable = new GL_InputTableRow();
            Type t = typeof(GL_InputTableRow);
            PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (DataColumn clmn in dataTable.Columns)
            {
                PropertyInfo pi = propInfos.FirstOrDefault(p => p.Name == clmn.ColumnName);
                if (pi != null && pi.CanWrite)
                {
                    pi.SetValue(efTable, dataTable.Rows[idxRow][clmn.ColumnName].ToString());
                }
            }
            outEntityTableRow = efTable;
        }


    }


Herman&lt;T&gt;.Instance

Я проверю ваше решение в эти выходные. Большое спасибо за вклад и пример!!