7

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 式には、さまざまなコンテキストに関連付けられているクエリへの参照が含まれています。

4

1 に答える 1

12

私が言える限り、あなたは何も見逃していません。

別のコンテキストからのもの、またはメモリ内参照オブジェクトを使用するクエリを作成することはできません。これらは両方とも SQL に変換できません。SQL パラメータに変換できるため、単純な値型のみを使用できます。

キーと値のペアのコレクションである辞書を使用していますが、これらの kvp は SQL に変換できません。また、単純な POCO クラスは .net オブジェクトであり、使用できません。

私が知っている唯一の例外は、.Contains() メソッドと、クエリで変換できる値の型のコレクション/リストを組み合わせたものです。例えば:

List<int> someIds = ...
var result = context.Data.Where(d => someIds.Contains(d.Id)).ToList();

レコードごとに物事を処理することを除けば、単一のクエリソリューションは見当たりません。

于 2012-08-16T12:37:31.860 に答える