Linq To EF:如何使用非原始类型进行过滤

时间:2011-04-20 11:00:07

标签: linq entity-framework entity-framework-4 linq-to-entities

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 to Entities不支持引用非标量变量(Person)。

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

//编辑:我正在尝试从personEntities中找到人物,他们与personOfInterest列表中的任何人具有相同的名称和相同的工作。例如,我试图在我的人身上找到一个名叫Bob的警察或名叫John的程序员 我得到的错误在here。(22.2)

中描述

2 个答案:

答案 0 :(得分: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...
        }
    }

OR 如果第一个不是一个选项,你可以按行进行连接(概念中):

    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();

我不知道您课程的内部,因此您必须调整示例以适合您的对象结构。

<强>编辑: 我修改了上面的示例以反映您编辑过的描述:

    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 :(得分:1)

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