【问题标题】:Unable to create a constant value of type 'TravelAgent'. Only primitive types or enumeration types are supported in this context无法创建“TravelAgent”类型的常量值。此上下文仅支持原始类型或枚举类型
【发布时间】:2015-11-12 14:25:32
【问题描述】:

我遇到了一个错误,我似乎不知道如何解决它。 错误: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;

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

我知道如果我在执行此 where 查询之前使用 ToList(),那么它将成功,但我不能这样做,因为这将返回 500 000 个帖子。

错误发生在where语句处。

我做错了什么?

谢谢。

【问题讨论】:

  • 想想你将如何在原始 sql 中做到这一点,你就会明白你做错了什么。

标签: c#


【解决方案1】:

您基本上要求在 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 中获取AgentIds 的列表以在SQL 中进行过滤,然后在C# 中进行多列比较。如果您以这种方式消除大部分不匹配的数据,那么它可能是最有效的路线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多