Linq 查询包含对在不同数据上下文中定义的项的引用
我有两个来自同一个DBs的var,联合后:Linq 查询包含对在不同数据上下文中定义的项的引用,linq,Linq,我有两个来自同一个DBs的var,联合后: var projectedP1 = P1.Select(x => new Project_test { ID_inString = x.ID.ToString(), col1 = x.col1, col2 = x.col2
var projectedP1 = P1.Select(x => new Project_test {
ID_inString = x.ID.ToString(),
col1 = x.col1,
col2 = x.col2,
col3 = x.col3 });
var union = projectedP1.Union(P2);
当P1单独使用或P2单独使用时,一切正常
但当2是union时,我在运行时得到:
查询包含对在不同数据上下文中定义的项的引用
我试过类似的帖子,但不明白。有人知道吗
您永远无法连接来自两个不同上下文的对象;因为union被编译成数据库查询,所以它不知道如何执行它,因为不支持多个DB。最好是分别对每个查询调用ToList(),这将执行数据库查询,并执行LINQ到对象的联合。这完全是一个迭代过程。很明显,这与P1和P2的创建方式有关,您还没有向我们展示。他们可能来自不同的数据上下文。我还假设你是问这个问题的同一个用户:-为什么你使用不同的用户帐户?是的,同一个人,因为我没有注册。基本上是使用数据库a为P1创建一个dbml(),另一个为P2创建一个dbml(),使用数据库BAh,您从未说过它们来自不同的数据库。你基本上不能在LINQ-to-SQL端这样做-它不会导致联合SQL查询,是吗?在设计时,数据库a和数据库B有两个不同的服务器,但在运行时,它们是相同的。这是LINQ的限制吗?忽略LINQ部分,您建议如何使用来自两个不同数据库的数据运行单个查询?您不需要调用ToList-只需使用AsEnumerable即可:
P1.AsEnumerable().Union(P2)
。感谢您的提示。。。您还必须在P2上执行它,因为它必须根据其上下文执行,不是吗?我猜这是因为它是第二个结果集,不是在第一个操作的上下文中执行的,它会很好地通过,并且不会尝试将联合作为其查询的一部分进行转换…不,您不必在P2上进行转换,因为在P1上进行转换意味着它将在Enumerable中使用实现,已将P1视为IEnumerable
。