我的问题是:
using( var ctxA = new AEntities())
using( var ctxB = new BEntities())
{
List<A> listOfA = from A in ctxA.A select new { Boo = A.Boo, Foo = A.Foo};
//do some operation to detach listOfA
//The code bellow does not work!
List<B> listOfB = from B in ctxB.B
join A in listOfA on
new { B.Boo, B.Foo} equals new {A.Boo, A.Foo}
select B;
}
如何进行此类查询,而不是下面的例外情况?
此上下文仅支持原始类型或枚举类型。
或者
System.NotSupportedException:指定的LINQ表达式包含对与不同上下文关联的查询的引用。
修改
根据您的回答Anshish我将查询选择代码更改为(并且有效):
List<B> listOfB = new List<B>();
listOfA.foreach( A =>{
lisfOfB.add( ctxB.B.Where( B=> B.Foo.Equals(A.Foo)).Where( B=> B.Boo.Equals(A.Boo));
});
但现在的问题是我正在对dabase进行listOfA.Count查询,我不是吗?
答案 0 :(得分:0)
原因是您无法比较用户定义的类型。即你无法比较类的对象。
尝试使用object的一些内部原始属性进行比较。例如:
例如,这是我的模型。
public class Student
{
public int StudentId {get; set;}
public string Name {get;set;}
}
如果我有两个对象:
Student s1= new Student{ StudentId=1, Name="Stu1"};
Student s2= new Student{ StudentId=2, Name="Stu2"};
如果我需要比较它们: 然后
if( s1.StudentId==s2.StudentId)
或
if(s1.Name==s2.Name)
这应该有效。只需写作
if(s1==s2)
不起作用,因为s1和s2不是原始类型,运行时不知道如何比较两个非原始类型的对象。
答案 1 :(得分:0)
您无法进行简单的连接,因为EF需要能够将表达式转换为服务器端表达式,这在客户端对象中不会起作用。我想你将不得不做以下事情:
using( var ctxA = new AEntities())
using( var ctxB = new BEntities())
{
List<A> listOfA = from A in ctxA.A select new { Boo = A.Boo, Foo = A.Foo};
var boos = listOfA.Select( a => a.Boo );
var foos = listOfA.Select( a => a.Foo );
var listOfB = ctxB.B.Where( b => boos.Contains( b.Boo ) && foos.Contains( b.Foo ) ).ToList();
}