gpt4 book ai didi

Linq 到 EF : How to filter using Non-Primitive types

转载 作者:行者123 更新时间:2023-12-05 01:37:23 26 4
gpt4 key购买 nike

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 列表中的任何人具有相同姓名和相同工作的人。例如,我试图在我的 personEntities 中找到任何一个叫 Bob 的警察或叫 John 的程序员。
here 中描述了我遇到的错误.(22.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();

我不知道你的类的内部,所以你必须调整示例以适应你的对象结构。

已编辑:我修改了上面的示例以反射(reflect)您编辑的描述:

    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 模型中的表/复杂类型?

关于Linq 到 EF : How to filter using Non-Primitive types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5729202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com