实体框架:在两个不同的上下文中使用条件检索数据



我正在两个不同的数据库(上下文不同)之间导入数据。

所以我有两个不同的背景。目标是将上下文 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.

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

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.同上) ||currentItems.Any(db=>db.键 == 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});
-

->

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

据我所知,你没有错过任何东西。

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

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

我知道的唯一例外是.包含 () 方法与某种值类型的集合/列表结合使用,可以在查询中转换。例如:

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

除了在每条记录的基础上处理事情之外,我没有看到单一查询解决方案。

相关内容

  • 没有找到相关文章