C#和LINQ比较两个列表中的特定项

时间:2016-12-06 17:32:24

标签: c# asp.net-mvc entity-framework linq

我有一个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

1 个答案:

答案 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));

未经测试的查询在晚上打字...但你明白了