2016-12-06 75 views
0

我有一個DTO類和一個使用實體框架轉換爲列表的表。C#和LINQ比較兩個列表中的特定項目

當我的網頁發佈時,它會發送我的dto列表。我想要做的是編寫代碼,根據特定元素將dto列表與EF列表進行比較。這是我的代碼...

MY 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

請告訴我問題嗎? – Liam

+0

「這不起作用,爲什麼?」你是什​​麼意思?你能解釋你想達到什麼嗎? –

+0

嘗試使用dto.contains(db)而不是== –

回答

1

寫小方法,

boolean compareDTOAndListItem(DTOAddNewSpecialNeed dto, AddEditSpecialNeedList item) { 
    //comparison logic here 
    if (dto.SpecialNeedTypeID != item.SpecialNeedTypeId) 
     return false; 

    return true; 
} 

然後你就可以隨時隨地輕鬆使用此方法,包括在LINQ查詢。 您可以創建一個額外的方法來比較兩個列表,或使用先進的LINQ查詢(加入,...)比較列表

例如,發現某個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)); 

未經測試的查詢類型深夜...但你的想法

+0

雖然這很有幫助,那是我的邏輯代碼在操作。它位於一個名爲「CompareDtoToDb」的小函數中。這是我需要知道如何正確工作的比較邏輯。 – tshoemake

+0

我更新了我的作品,希望能幫到 – tshoemake

+0

我沒有完全理解你。比較邏輯特定於您的應用程序和業務規則。 Imho,比較方法應該簡單地在第一場比較失敗時返回false,或者在結束時返回true。所以你可以基於該運算符方法篩選列表 –