无法创建类型为';TravelAgent';.在此上下文中仅支持基元类型或枚举类型

本文关键字:类型 支持 枚举 创建 TravelAgent 上下文 | 更新日期: 2023-09-27 18:21:49

我遇到一个错误,似乎不知道如何解决。错误:Unable to create a constant value of type 'TravelAgent'. Only primitive types or enumeration types are supported in this context.

public class TravelAgent
    {
        public string SalesOwnerId { get; set; }
        public string AgentId { get; set; }
    }
    var result = db.TRAVEL_AGENT.Where(x => TravelAgents.Any(f=>f.AgentId == x.AgentId && f.SalesOwnerId == x.SalesOwnerId)).ToList();
    dataGridView2.DataSource = result;

列出TravelAgent,包含TravelAgent的实例。我想从Travel_Agent中获取所有行,在那里我可以找到与列表中相同的AgentId和SalesOwnerId。

我知道如果我在做这个where查询之前使用ToList(),那么它会成功,但我不能这样做,因为它会返回大约50万个帖子。

错误发生在where语句处。

我做错了什么?

谢谢。

无法创建类型为';TravelAgent';.在此上下文中仅支持基元类型或枚举类型

您基本上是在请求SQL中的数据和内存中的数据之间的多列JOIN,这并不简单。在EF之外,您可以将这两个查找列作为表变量传递,但据我所知,EF不支持这一点。一种选择是将列连接到一个字符串数组中,该数组可以通过IN子句在SQL中使用:

var lookups = TravelAgents.Select(f=>f.AgentId + "|" + f.SalesOwnerId);
var result = db.TRAVEL_AGENT
               .Where(x => lookups.Contains(x.AgentId + "|" + x.SalesOwnerId))
               .ToList();

但是,由于不太可能在两列的字符串串联上有索引,因此查询可能效率不高。

另一种选择是从TravelAgents中获取AgentId的列表,以便在SQL中进行筛选,然后在C#中进行多列比较。如果以这种方式消除大多数的不匹配数据,那么这可能是最有效的路由。