我在数据库中有一个表,它记录与用户配置文件相关的打印机。我的数据库看起来像这样:
|Date | UserID | PcId | PrinterId | ConfigId
|... | 1 | 1 | 1 | 1
|... | 1 | 1 | 2 | 2
|... | 1 | 1 | 3 | 3
|... | 1 | 1 | 4 | 4
我正在使用 WCF 服务在 Db 中上传有关打印机的新信息。用户可以从他的本地配置文件中删除打印机。在这种情况下,当下一次信息完成时,必须从数据库中删除这台打印机。
我的目标是将新打印机名称与 db 中记录的打印机名称(与用户/pc 相关)进行比较,如果新列表中不存在 db 中的打印机名称,我必须将其从数据库中删除,因为未使用此打印机了。
我的方法不起作用,因为它始终是删除的打印机列表的第一个元素,而不是好的元素。例如,如果我想删除 PrinterId #4,它是被删除的 #1。
这是我的方法
//Printers related to user/pc
var ptrInList = context.AuditPrinters.Include(a => a.PrintersConfigs)
.Include(a => a.Printers)
.Where((c => c.UserId == userInDb && c.PcId==pcInDb))
.ToList();
//Iteration on fresh data from client
foreach (var p in data)
{
var printersInDb = ptrInList
.SingleOrDefault(c => c.Printers.PrinterName == p.Printer); // runs in memory
if (printersInDb != null)
{
AuditPrinters apt = context.AuditPrinters
Where(t => t.PrinterId == printersInDb.PrinterId &&
t.PcId==pcInDb && t.UserId==userInDb)
.FirstOrDefault();
apt.Date = DateTime.Now;
PrintersConfigs cfg = context.PrintersConfigs
.Where(t => t.ConfigId == printersInDb.ConfigId).FirstOrDefault();
cfg.IsDefault = bool.Parse(p.Default);
}
else
{
var RF = new AuditPrinters()
{
Date = DateTime.Now,
UserId = userInDb,
PcId = pcInDb
};
var PTR = new Printers()
{
PrinterServ = p.PrinterSrv,
PrinterName = p.Printer
};
var CFG = new PrintersConfigs() { IsDefault = bool.Parse(p.Default) };
PTR.AuditPrinters.Add(RF);
CFG.AuditPrinters.Add(RF);
context.Set<Printers>().Add(PTR);
context.Set<PrintersConfigs>().Add(CFG);
}
}
//List of printers name in fresh data
var ptr = data.Select(c => c.Printer).ToList();
foreach (var p in ptrInList)
{
AuditPrinters printerToDelete = context.AuditPrinters
.Where(u => !ptr.Contains(p.Printers.PrinterName) &&
(p.UserId == userInDb) && (p.PcId == pcInDb))
.FirstOrDefault();
if (printerToDelete != null)
context.AuditPrinters.Remove(printerToDelete);
}