我在SQL Server中有一个名为“JobInfos”的数据库表,其中包含许多列。
JobID -(int)在添加数据时自动填充递增值组织代码-(字符串)订单编号-(int)工作单-(int)客户-(字符串)基本模型项目-(字符串)订单数量-(int)承诺日期-(字符串)行类型-(字符串)
使用Blazor应用程序,通过Entity Framework和CSVHelper,一天可以多次写入该表。这非常好用。CSV文件中的所有行都被添加到数据库中。
if (fileExist)
{
using (var reader = new StreamReader(@path))
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<CsvRow>().Select(row => new JobInfo()
{
OrgCode = row.OrgCode,
OrderNumber = row.OrderNumber,
WorkOrder = row.WorkOrder,
Customer = row.Customer,
BaseModelItem = row.BaseModelItem,
OrdQty = row.OrdQty,
PromiseDate = row.PromiseDate,
LineType = row.LineType,
});
using (var db = new ApplicationDbContext())
{
while (!reader.EndOfStream)
{
if (lineNumber != 0)
{
db.AddRange(records.ToList());
db.SaveChanges();
}
lineNumber++;
}
NavigationManager.NavigateTo("/", true);
}
}
由于这些多个CSV文件可能包含数据库表中已经存在的行,因此在从表中读取时,我会得到重复的记录,这导致用户手动删除所有较新的重复行,只保留原始条目。
我无法控制CSV文件或其创建。我尝试仅添加包含基于工作单号的新数据的行,该工作单号不能与任何其他工作单号相同。
我在StackOverflow上找到了另一个帖子,这很有帮助,但我被一个我无法解决的剩余错误卡住了。
The Helpful post
我在这里更改了代码...
if (lineNumber != 0)
{
var recordworkorder = records.Select(x => x.WorkOrder).ToList();
var workordersindb = db.JobInfos.Where(x => recordworkorder.Contains(x.WorkOrder)).ToList();
var workordersNotindb = records.Where(x => !workordersindb.Contains(x.WorkOrder));
db.AddRange(records.ToList(workordersNotindb));
db.SaveChanges();
}
但这条线...
var workordersNotindb = records.Where(x => !workordersindb.Contains(x.WorkOrder));`
在结束时抛出错误(x.WorkOrder)- CS1503参数1:无法从“int”转换为“DepotQ4.Data.JobInfo”
WorkOrder是一个int JobID是一个int主键表中的每条记录都必须有一个唯一的WorkOrder
我不确定我没有看到什么。这里需要帮助吗?
1条答案
按热度按时间pbossiut1#
你的变量
workordersindb
是List<JobInfo>
。所以当你试图从records.Where(x => !workordersindb.Contains(x.WorkOrder))
中选择时,你试图将workordersindb
中的JobInfo
列表与x.WorkOrder
中的int
进行匹配。workordersindb
需要是List<int>
才能与Contains
一起使用。records
也会有同样的问题,但您通过创建变量recordworkorder
并使用records.Select(x => x.WorkOrder)
得到List<int>
来解决了这个问题。