2 つの異なるデータベース (コンテキストが同じではない) 間でデータをインポートしています。
だから私は2つの異なる文脈を持っています。目標は、コンテキスト A の一部のデータをコンテキスト B にインポートすることです。
コンテキスト B のデータは直接編集されることはなく、コンテキスト A からのみインポートされます。コンテキスト B では、インポート元の ID をコピーしました。
現在、コンテキスト B にない、またはより新しいバージョンのすべてのデータのリストを取得しようとしています。
2 つのテーブルに ModifiedAt" フィールドがあり、フィールドが変更されたかどうかを知ることができます。
これが私の現在のコードです:
//Here I get all my current data in the context B with their modification time
Dictionary<int,DateTime> currentItems = contextB.Dossiers.ToDictionary(d=>d.MatchingReferenceId, d=>d.ModifiedAt);
//And here the pain starts:
contextA.Dossiers.Where(da=> !currentItems.Keys.Contains(da.Id) || currentItems.FirstOrDefault(db=>db.Key == da.Id).Value <da.ModifiedAt)//And I'm looping on it with a foreach.
最初の部分 (コンテキスト B に要素があるかどうかを確認する場所) は機能しますが、2 番目の部分では次の例外が発生しました。
Unable to process the type 'System.Collections.Generic.KeyValuePair`2[]', because it has no known mapping to the value layer.
しかし、IDと変更時間の間にこのリンクを設定することはできません(最初は、他のコンテキストからPOCOクラスを持っていましたが、匿名型でも試しましたが、同じ結果です)
私は何が欠けていますか?
編集 1
私もまったく同じ結果でこれを試しました: contextA.Dossiers.Where(da=> !currentItems.Keys.Contains(da.Id) || currentItems.Any(db=>db.Key == da.Id && db.価値
編集 2
私はラムダを試しましたが、ここでは同時に2つのコンテキストで遊ぶのが好きではありません:
var myList = (from db in contextB.Dossiers
let dstId = newContext.Dossiers.Select(d=>d.MatchingReferenceId)
from da in contextA.Dossiers
where !db.Contains(dSource.ID)|| (db.MatchingReferenceId == da.Id && db.ModifiedAt< da.ModifiedAt)
select new {NewId =db.Id, OldId = da.Id});
-->
指定された LINQ 式には、さまざまなコンテキストに関連付けられているクエリへの参照が含まれています。