无法创建类型为';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语句处。
我做错了什么?
谢谢。
您基本上是在请求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#中进行多列比较。如果以这种方式消除大多数的不匹配数据,那么这可能是最有效的路由。