2013-12-18 2 views
0

(См this вопрос для небольшого фона на этом.)IEnumerable.GroupJoin и Entity Framework объекты

Мне нужно, чтобы совпасть пункты в List<T> коллекции Entity записей с List<T> коллекции объектов (объект Entity коллекция относится к типу Citation, а другая относится к типу sRecord). Существует взаимная связь 1 к 1 между второй коллекцией и первой, где каждый из объектов во втором совпадает с точностью до одной записи в первом (но не обязательно наоборот). Они совпадают в одном поле с идентификатором в классе Citation и id в классе sRecord. Попытка запустить через вложенные петли в соответствии с ними быстро стала увязшей, поэтому я искал средство, чтобы сопоставить все коллекции один раз, а затем перебирать этот согласованный набор.

Вот как я соединял предлагаемую группу присоединиться заявление:

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

У меня нет много уверенности, что я получил это право.

Что мне нужно сделать с полученным согласованным набором, это сравнить поля в объекте sRecord с полями объекта Citation, чтобы определить, нужно ли обновлять объект Citation. Поскольку я работаю с Entity, я предположил, что мне нужно сохранить ссылку на объект 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++; 
} 

на данный момент, я получаю сообщение об ошибке IntelliSense на match.Citation в вызове MapToCitation, заявив, что «свойство, индексатор или динамический доступ члена не может быть принят в качестве отказа или реф параметра. "

Мне нужно убедиться, что объект Citation, который сохраняется, когда я делаю context.Save() обновляется из объекта sRecord, если это необходимо. Мне также нужно убедиться, что я экономлю время с совпадением по сравнению с предыдущим кодом. Что мне нужно изменить для моего кода для достижения этих целей?

+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. 
} 

Это должно хорошо работать & прост для понимания.

Смежные вопросы