如何使用其两个属性基于自定义对象列表进行查询

时间:2014-02-21 19:09:46

标签: .net linq entity-framework

我的问题是:

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查询,我不是吗?

2 个答案:

答案 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();
}