2013-12-18 98 views
0

(見this問題要問在這一個小背景。)IEnumerable.GroupJoin和Entity Framework對象

我需要在List<T>集合實體記錄項目有List<T>集合對象的匹配(實體對象集合是引用類型,另一個是sRecord類型)。第二個集合和第一個集合之間存在一對一的關係,第二集合中的每個對象都與第一個集合中的一個記錄完全匹配(但不一定相反)。它們匹配Citation類中的ID和sRecord類中的ID。試圖通過嵌套循環來匹配它們很快就陷入了困境,所以我尋找了一種方法來匹配整個集合,然後遍歷匹配的集合。

我這是怎麼放在一起建議組加入聲明:

var draftMatches = draftRecords.GroupJoin(sRecords, 
    Citation => Citation.ID, 
    stiRecord => sRecord.id, 
    (Citations, sRecords) => 
    new 
    { 
     Citation = Citations, 
     sRecord = sRecords.Select(sRecord => sRecord) 
    }); 

我沒有太多的信心,我得到它的權利。

我需要做的結果匹配的集合是將sRecord對象中的字段與Citation對象中的字段進行比較,以確定Citation對象是否需要更新。由於我正在使用實體,因此我假設我需要保留對引用對象的引用,當我在一個單獨的方法中更新它(爲了代碼重用目的而分開)時,所以這就是我想要做的更新:

DateTime recordDate = RecordUtilities.ConvertToDate(match.sRecord.FirstOrDefault().modifiedDate); 
int comparison = recordDate.CompareTo((DateTime)match.Citation.modifiedDate); 

if (comparison > 0) 
{ 
    EntityUtilities.MapToCitation(ref match.Citation, match.sRecord.FirstOrDefault()); 
    updatedDraft++; 
} 

在這一點上,我得到的match.Citation的智能感知錯誤在調用MapToCitation,說明「的屬性,索引器或動態成員訪問可能不被作爲out或ref參數傳遞。 「

我需要確保在執行context.Save()時從sRecord對象更新(如果適用)時保存的Citation對象。我還需要確保我在前面的代碼中節省了匹配時間。爲了實現這些目標,我需要更改我的代碼?

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

我的歉意;沒有意識到我已經做到了。 – Ant

回答

1
var draftRecordDic = draftRecords.ToDictionary(record => record.ID); 
var sRecordsDic = sRecords.ToDictionary(record => record.ID); 

var validKeys = sRecordsDic.Keys.Intersect(draftRecordDic.Keys); 
foreach(var key in validKeys) 
{ 
    var recOriginal = draftRecordDic[key]; 
    var recMo = sRecordsDic[key]; 

    // do your code here. 
} 

這應該很好用&很容易理解。