Отображение 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<T>.Instance
Добавлен кодовый бит
GKP1992
Спасибо за подробности. Можете ли вы также поделиться структурой таблицы, я не уверен, зачем вам нужны имена столбцов во входном файле. Если они будут основываться на количестве столбцов в файле excel, почему бы не обновить столбцы последовательно, используя цикл foreach, а остальные обновить с помощью нулей?
Herman<T>.Instance
хорошо.. файл ввода сущности - это структура таблицы.
Дело в том, что мое приложение получает файл EXCEL. Затем считывается конкретный рабочий лист, и значения преобразуются в объект DATATABLE. Вот почему я знаю только то, что невозможно иметь более 60 колонок. Но сколько может быть разных.
Поэтому я надеялся найти способ, который на основе количества столбцов каждого значения datarow должен быть сопоставлен с полем в таблице. Так что столбцы, которых у меня нет, остаются нулевыми.
GKP1992
Привет дигиманус,
Это не так просто, как кажется, но, насколько я могу понять вашу проблему,вы можете воспользоваться методами Take и Range класса Enumerable. Используйте имена столбцов.Подсчитайте, чтобы взять коллекцию лабораторий и VAR и обновить их, используя a для каждого.
Надеюсь, это поможет.
Herman<T>.Instance
Спасибо за подсказку. Я займусь расследованием.
GKP1992
Вы можете использовать отражение для перечисления свойств вашей сущности. Таким образом, вы можете легко определить, какие свойства необходимо обновить.