c# - 如何从映射表中插入模型
问题描述
我有想法使用表中的映射从 excel 中插入我的模型。因为我的 excel hv 超过 100 列。如果我像我一样手动编码会很累。我想将表头 excel 的名称、函数和表的行保存到数据库中
首先,我读取我的excel然后捕获到数据集,然后是foreach数据集,然后对于每个列表映射,然后使用是否知道是否为空,然后使用replace读取函数,然后使用映射表设置模型
我所做的:
[HttpPost]
public ActionResult upload(HttpPostedFileBase uploadFile)
{
private DB_Entities db = new DB_Entities();
dataset ds = new dataset();
ds = GetFileExcel(uploadFile);
foreach (DataRow dr in ds.Tables["Header$"].Rows)
{
tbl_header header = new tbl_header();
string name = dr["Name"].ToString();
if (name != "") {
var resultName = Convert.ToInt32(name);
header.name = resultName;
}
string address = dr["Address"].ToString();
if (address != "") {
var resultAddress = DateTime.ParseExact(address, "dd MMM yyyy", provider);
header.address = resultAddress;
}
string country = dr["Country"].ToString();
if (country != "") {
var resultCountry = db.tbl_Item.Where(a => a.Code == country).Select(a => a.Id).SingleOrDefault();
header.country = ResultCountry;
}
db.tbl_header.Add(header);
db.SaveChanges();
}
}
public partial class tblT_Pengeluaran_Header
{
public int name { get; set; }
public DateTime address { get; set; }
public int country { get; set; }
}
我想要的是:
[HttpPost]
public ActionResult upload(HttpPostedFileBase uploadFile)
{
private DB_Entities db = new DB_Entities();
dataset ds = new dataset();
ds = GetFileExcel(uploadFile);
var mapping = db.Tbl_Mapping.toList();
foreach (DataRow dr in ds.Tables["Header$"].Rows)
{
tbl_header header = new tbl_header();
//foreach list mapping to doing:
//{
// string excel = ReadExcel
// if (excel != "") {
// string resultFunction = ReadFunction.Replace('[data]',excel);
// var result = Execute(resultFunction);
// header.ReadTable = result;
// }
//}
db.tbl_header.Add(header);
db.SaveChanges();
}
}
表映射示例:Tbl_Mapping
table | excel | function
_____________________________________
name | Name | Convert.ToInt32([data]);
address | Address | DateTime.ParseExact([data], "dd MMM yyyy", provider);
country | Country | db.tbl_Item.Where(a => a.Code == [data]).Select(a => a.Id).SingleOrDefault();
.....
.....
这个怎么做?任何想法???谢谢
解决方案
我可以在您的代码中看到两个问题。
- 从 foreach 中的数据库中获取国家对象
- 数据库保存在 foreach 中。
以上两者都对性能不利。请考虑以下内容。
首先,从数据集中获取所有国家/地区并进行单个数据库查找并使用 AddRange 而不是 add。
对于数据集到映射对象的转换,使用如下 Linq。
[HttpPost]
public ActionResult upload(HttpPostedFileBase uploadFile)
{
private DB_Entities db = new DB_Entities();
DataSet ds = GetFileExcel(uploadFile);
string[] countryCodes = ds.Tables["Header$"].AsEnumerable().Select(row => row.Field<string>("country")).ToArray();
var selectedCountries = db.tbl_Item.Where(q => countryCodes.Contains(q)).Select(s => new { Id = s.Id, Code = s.Code }).ToList();
List<tbl_header> headers = ds.Tables["Header$"].AsEnumerable().Select
(
row => new tbl_header
{
name = row.Field<string>("Name") == string.Empty ? 0 : int.Parse(row.Field<string>("Name")),
address = row.Field<string>("Address") == string.Empty ? DateTime.MinValue : DateTime.ParseExact((row.Field<string>("Address")), "dd MMM yyyy", provider),
country = selectedCountries.SingleOrDefault(q=> q.Code == row.Field<string>("Country")).Id
}
).ToList();
db.tbl_header.AddRange(headers);
db.SaveChanges();
}
推荐阅读
- javascript - 未捕获的类型错误:在 null
- git - if 条件作为 GIT 命令的一部分
- highcharts - 白色填充组织结构图的连接线
- c - 简单 GTK 示例中的预期声明说明符
- sql - 在冲突更新时将数据从一列插入/更新到另一列,只有那些对特定字段具有不同值的数据?
- git - 在 azure devops 上使用 api 检查 git 分支是否被锁定
- rubygems - 在 OSX 10.15.4 Catalina 上安装 libv8 gem 失败
- instructions - 现代 CPU 可以执行哪些指令?
- json - 使用 GenSON 从 JSON 文件生成 JSON 模式
- python - 最大重试次数超过 URL(由 NewConnection 错误引起)