我有一些代码非常相似,并希望减少重复的数量。
除了操作的DbSet<>之外,以下两种方法在各个方面都是相似的。一个在PPD上操作,另一个在ChestXRays上操作。
我如何消除复制的数量,因为我有更多的DbSet<>,我需要采取类似的行动。
public CommandResult CreditPpdService(GenericCreditDto vm)
{
var insertModified = _hlthOidContext.PPDs
.AsNoTracking()
.FirstOrDefault(c => c.PPDId == vm.TheServiceId);
if (insertModified != null)
{
var flagOriginalAsDeleted = _hlthOidContext.PPDs
.FirstOrDefault(c => c.PPDId == vm.TheServiceId);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
_hlthOidContext.PPDs.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}还有另一种方法
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
var insertModified = _hlthOidContext.ChestXRays
.AsNoTracking()
.FirstOrDefault(c => c.ChestXRayId == vm.TheServiceId);
if (insertModified != null)
{
var flagOriginalAsDeleted = _hlthOidContext.ChestXRays
.FirstOrDefault(c => c.ChestXRayId == vm.TheServiceId);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
_hlthOidContext.ChestXRays.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}_hlthOidContext在哪里
public partial class HLTH_OIDContext : DbContext
{
static HLTH_OIDContext()
{
Database.SetInitializer<HLTH_OIDContext>(null);
}
public HLTH_OIDContext()
: base("Name=HLTH_OIDContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
...
public DbSet<ChestXRay> ChestXRays { get; set; }
public DbSet<PPD> PPDs { get; set; }
...更多的信息
public interface ISoftDelete
{
bool IsDeleted { get; set; }
}
public partial class ChestXRay : ISoftDelete { }
...
public partial class PPD : ISoftDelete { }发布于 2015-12-03 19:35:45
这里有一个想法,我将展示给您当前代码的一系列重构。如果每个类型(ChestXRayId、PPDId等)的"Id“属性是相同的,则会更容易一些,因为您也可以将Id提取到公共接口中。
首先,将DbSets和FirstOrDefault谓词重构为变量:
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
DbSet<ChestXRays> dbSet = _hlthOidContext.ChestXRays;
Expression<Func<ChestXRays, bool>> predicate = c => c.ChestXRayId == vm.TheServiceId;
var insertModified = dbSet
.AsNoTracking()
.FirstOrDefault(predicate);
if (insertModified != null)
{
var flagOriginalAsDeleted = dbSet
.FirstOrDefault(predicate);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
dbSet.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}然后提取泛型类型参数并将这些变量参数化。
您将需要一个IsDeleted属性的接口,并将泛型类型限制在这个接口上(从注释中看,这是通过ISoftDelete实现的)。
private CommandResult CreditService<T>(GenericCreditDto vm, DbSet<T> dbSet, Expression<Func<T, bool>> predicate)
where T : class, ISoftDelete
{
var insertModified = dbSet
.AsNoTracking()
.FirstOrDefault(predicate);
if (insertModified != null)
{
var flagOriginalAsDeleted = dbSet
.FirstOrDefault(predicate);
if (flagOriginalAsDeleted != null)
{
flagOriginalAsDeleted.IsDeleted = true;
}
dbSet.Add(insertModified);
_hlthOidContext.Entry(insertModified).CurrentValues.SetValues(vm);
_hlthOidContext.SaveChanges();
}
var results = new CommandResult();
return results;
}使用任何特定类型调用此泛型方法:
public CommandResult CreditChestXRayService(GenericCreditDto vm)
{
return CreditService(vm, _hlthOidContext.ChestXRays, c => c.ChestXRayId == vm.TheServiceId);
}
public CommandResult CreditPpdService(GenericCreditDto vm)
{
return CreditService(vm, _hlthOidContext.PPDs, c => c.PPDId == vm.TheServiceId);
}https://stackoverflow.com/questions/34074027
复制相似问题