【问题标题】:Linq To EF : How to filter using Non-Primitive typesLinq To EF:如何使用非原始类型进行过滤
【发布时间】:2011-04-21 21:56:44
【问题描述】:
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)。

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

//edit:我正在尝试从 personEntities 中查找人员,他们与 personOfInterest 列表中的任何人具有相同的姓名和相同的工作。例如,我试图在我的 personEntities 中查找名为 Bob 的警察或名为 John 的程序员。
here.(22.2) 中描述了我遇到的错误

【问题讨论】:

  • 异常的具体信息是什么?是关于“Linq to Entities 不支持引用非标量变量(Person)”的部分。来自您的分析吗?因为我相信这是因为“poi.Job == p.Job”。
  • 您的代码似乎无法编译。 ContainsPerson 对象作为第一个参数,而不是 lambda 表达式。你应该改用Any
  • 您能用文字描述一下您拥有和正在尝试做的事情吗?
  • 我已经附上了我的答案。虽然我还有一个问题:您的代码中的 PersonEntities 是自定义集合类型还是您的 EF 模型中的表/复杂类型?
  • 它是我的 EF 模型中的表/复杂类型

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


【解决方案1】:

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

然后您可以执行以下操作:

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

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

已编辑: 我已经修改了上面的示例以反映您编辑的描述:

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

【讨论】:

    【解决方案2】:

    最好比较 ID 而不是对象。这将更有效率。问题是 EntityFramework 没有如何将 obj1 == obj2 翻译成 SQL。

    【讨论】:

    • 我无法与 ID 进行比较——两个不同 ID 的人可以拥有相同的姓名和相同的工作。
    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多