EntityFramework:在两个不同的上下文中检索具有条件的数据

J4N*_*J4N 7 sql linq datacontext entity-framework cross-database

我在两个不同的数据库(具有相同的上下文)之间导入数据.

所以我有两个不同的背景.目标是将上下文A的一些数据导入上下文B.

从不直接编辑上下文B中的数据,它们仅从上下文A导入.在上下文B中,我将复制从中导入它的ID.

现在我正在尝试检索列表中所有不在上下文B中或具有更新版本的数据.

我在两个表中有一个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.
Run Code Online (Sandbox Code Playgroud)

第一部分(我检查上下文B是否包含元素)工作,第二部分,我得到了这个例外:

Unable to process the type 'System.Collections.Generic.KeyValuePair`2[]', because it has no known mapping to the value layer.
Run Code Online (Sandbox Code Playgroud)

但我不能做更简单的Id和修改时间之间的这个链接(在开始时,我从其他上下文有一个POCO类,我也试过匿名类型,相同的结果)

我错过了什么?

编辑1

我也用完全相同的结果尝试了这个:contextA.Dossiers.Where(da =>!currentItems.Keys.Contains(da.Id)|| currentItems.Any(db => db.Key == da.Id && db.值

编辑2

我试过lambda,但在这里它不喜欢同时使用两个上下文:

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});
Run Code Online (Sandbox Code Playgroud)

- >

指定的LINQ表达式包含对与不同上下文关联的查询的引用.

Maa*_*ten 12

据我所知,你没有遗漏任何东西.

您无法创建使用来自其他上下文或内存引用对象中的任何内容的查询.这两件事都无法转化为SQL.只能使用简单的值类型,因为它们可以转换为SQL参数.

您正在使用字典,它是键值对的集合,并且这些kvp无法转换为SQL.您的简单POCO类也是一个.net对象,无法使用.

我所知道的唯一例外是.Contains()方法与某些值类型的集合/列表相结合,可以在查询中进行转换.例如:

List<int> someIds = ...
var result = context.Data.Where(d => someIds.Contains(d.Id)).ToList();
Run Code Online (Sandbox Code Playgroud)

除了在每个记录基础上处理事物之外,我没有看到单查询解决方案.

  • 我明白你的意思了,但是没有任何单一的结构元素可以被EF理解?我想如果像contains这样的方法可以工作,并且它有方法可以使用字典(ToDictionary),它应该适用于简单的KeyValuePair元素. (2认同)