3
public class Person 
{ 
    public int ID { get; set; } 
    public int Job { get; set; } 
    public string Name { get; set; } 
} 

List<Person> personsOfInterest = GetPersonsOfInterest(); 

PersonEntities personEntities = new PersonEntities(); 

var filteredPersons = personEntities.Where(p => personsOfInterest.Any(poi => poi.Job == p.Job && poi.Name == p.Name)); 

上面的代码生成NotSupportedException异常,因为LINQ到实体不支持引用非标量变量(Person)进行过滤。Linq到EF:如何使用非原始类型

我该如何解决这个问题?谢谢!

//编辑:我试图从personEntities中找到person,与personOfInterest列表中的任何人都有相同的名称和相同的工作。例如,我试图在我的人物中找到任何人,他是名叫鲍勃的警察或名叫约翰的程序员。
我得到的错误描述于here。(22.2)

+1

什么是异常的信息?是关于“Linq to Entities不支持引用非标量变量(Person)”的部分。“从你的分析的消息来看?因为我相信这是因为“poi.Job == p.Job”。 – AbdouMoumen 2011-04-20 12:32:26

+1

似乎你的代码不会编译。 'Contains'将'Person'对象作为第一个参数,而不是lambda表达式。你应该使用'Any'来代替。 – Yakimych 2011-04-20 13:36:30

+0

你能用文字描述你到底在做什么和正在做什么? – Andrei 2011-04-20 23:47:21

回答

2

首先,两个集合都应该包含相同类型的对象。

然后,你可以做到以下几点:

var filteredPerosns = personEntities 
      .Where(p => personsOfInterest.Contains(p, new MyPersonComparer())); 

创建类:

class MyPersonComparer : IEqualityComparer<Person> 
    { 
     public bool Equals(Person x, Person y) 
     { 
      return x.Job == y.Job && x.Name == y.Name; 
     } 

     public int GetHashCode(Person obj) 
     { 
      return obj.PersonID; //Just for example... 
     } 
    } 

如果第一个是不是一种选择,你可以做一个连接线沿东西线(在概念中):

List<int?> listA = new List<int?>() {1, 2, 3, 4, 5, 6, 7}; 
    List<int?> listB = new List<int?>() {5}; 

    bool result = (from a in listA 
        join b in listB on a equals b 
        select a).Any(); 

我不知道你的类的内部,所以你将不得不调整的例子,以适应你的对象结构。

EDITED: 我已经修改上面的例子中,以反映编辑的描述:在代码

List<Person> personsOfInterest = GetPersonsOfInterest(); 

    var filteredPersons = (from a in personEntities 
      join b in personsOfInterest on new{a.Name, a.Job} equals new {b.Name, b.Job} 
      select a).ToList(); 

PersonEntities,是自定义集合型或这是表中的/复杂类型的EF模型?

1

最好比较ID而不是对象。这将会更有效率。问题是EntityFramework没有如何将obj1 == obj2转换为SQL。

+0

我无法与ID进行比较 - 具有不同ID的两个人可以具有相同的名称和相同的作业。 – Yeonho 2011-04-21 01:56:14

+0

你不能使用Job.ID? – 2011-04-21 18:52:21