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)
中描述答案 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。