我有一个DTO类和一个使用Entity Framework转换为列表的表。
当我的网页发布时,它会发送我的dto列表。我想做的是编写代码,根据具体元素将dto列表与EF列表进行比较。这是我的代码......
我的dto
public class DTOAddNewSpecialNeed
{
public long PersonId { get; set; }
public List<AddEditSpecialNeedList> SelectedSpecialNeeds { get; set; }
public List<AddEditSpecialNeedList> AvailableSpecialNeeds { get; set; }
public Guid LtcConcurrencyCheck { get; set; }
public class AddEditSpecialNeedList
{
public int PersonSpecialNeedId { get; set; }
public int SpecialNeedTypeId { get; set; }
public string SpecialNeedDescription { get; set; }
public DateTime? StopDate { get; set; }
public int SortOrder { get; set; }
}
}
我的访问代码... dtoSelectedList是我传入的dto列表...我的dbSelectedList是我的ef对象(表格)我比较。基本上我想保留db中存在的所有dto的列表(dbselectelist中的specialneedtypeid匹配和specialneedtype不是其他的(-12)。我也可以有重复。现在这段代码没有帐号对于它。有没有更好的方法来编写这段代码,或者我只是把我的比较错了?
var matchedDtos = dtoSelectedList.SelectMany(dto => dbSelectedList
.Where(db => db.SpecialNeedTypeID == dto.SpecialNeedTypeId
&& dto.SpecialNeedTypeId != -12)).ToList();
var matchedOtherDtos = dtoSelectedList.SelectMany(dto => dbSelectedList
.Where(db => db.SpecialNeedTypeID == dto.SpecialNeedTypeId
&& dto.SpecialNeedTypeId == (int)SpecialNeedType.Other
&& db.OtherTypeText == dto.SpecialNeedDescription.Replace("Other: ", "").Trim())).ToList();
我的方法签名,其中包含上述逻辑。 SpecialNeed类是由实体生成的类:
public List<SpecialNeed> NeedsCompareDtoToDb(List<DTOAddNewSpecialNeed.AddEditSpecialNeedList> dtoSelectedList, List<SpecialNeed> dbSelectedList
答案 0 :(得分:1)
写一点方法,
例如
boolean compareDTOAndListItem(DTOAddNewSpecialNeed dto, AddEditSpecialNeedList item) {
//comparison logic here
if (dto.SpecialNeedTypeID != item.SpecialNeedTypeId)
return false;
return true;
}
然后您可以在任何地方轻松使用此方法,包括在LinQ查询中。 您可以创建一个额外的方法来比较2个列表,或使用高级Linq查询(Join,...)来比较列表
示例,查找与dto匹配的项目
var dto = yourdto;
var items = yourlistofitems;
var matchingitems = items.Select(x => compareDTOAndListItem(dto, x));
希望有所帮助......
编辑:用它来比较列表
你不能使用任何Linq比较器吗?
var listitems = allyourlistitems;
var dtos => allyourdtos;
var dtomatches = dtos.Where(d =>listitems.Any(l => compareDTOAndListItem(d, x));
var dotnotmatching = dtos.where(d => !dtomatches.Contains(d));
未经测试的查询在晚上打字...但你明白了