的EntityFramework:用条件检索在两个不同的上下文数据(EntityFramework:

2019-09-21 06:57发布

我输入两个不同的数据库之间的数据(有不一样的情况下)。

所以我的两个不同方面。 我们的目标是在上下文中的一些数据导入到上下文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.Id)|| currentItems.Any(DB => db.Key == da.Id &&分贝!值

编辑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表达式包含对与不同上下文关联的查询引用。

Answer 1:

至于我可以告诉你,不会错过任何。

你不能在内存中创建的参考对象,它使用的东西从另一个方面查询,或任何。 这两种东西不能被转换为SQL。 只有简单的值类型都可以使用,因为它们可以被转换成一个SQL参数。

您正在使用的字典,这是键 - 值对的集合,而这些KVP的不能转换成SQL。 此外,您的简单的POCO类是.NET对象,不能使用。

我所知道的唯一的例外是在组合。载有()方法有一定的价值类型,它可以在查询被翻译的集合/列表。 例如:

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

除了在每备案基地搬运东西,我没有看到一个单一查询的解决方案。



文章来源: EntityFramework: Retrieve data with a condition on two different context