c# - 连接来自 IQueryable 和 IList<KeyValuePair> 的数据

标签 c# linq entity-framework join

我正在尝试将一行父数据连接到已被压缩为单个数据的相关集合。

我有一个IQueryable订单数量:

IQueryable<Order> orderList = context.Set<Order>
                              .Where("OrderDate >= @0", startDate)
                              .Where("OrderDate <= @0", endDate)

以及相关的IList<KeyValuePair<int, string>>其中每个 KVP 包含 OrderID 和每个订单行中产品名称的串联字符串。我想根据 OrderID Key 将正确的 KeyValuePair 中的值加入到订单信息中。

为了说明这一点,所需的输出如下所示:

OrderNum  OrderDate   Customer    State       OrderTotal   Products_Ordered
12345     12/12/2012  J.Bloggs    WA          $25.50       Bolts, Hammer, Suregrip Clamp

我正在尝试如下所示的 linq join:

IQueryable result = from o in orders
                    join line in orderLines on o.OrderID equals line.Key
                    select new
                    {
                      o.OrderNum
                      o.OrderDate,
                      o.Customer.CustomerFullName,
                      o.DeliverAddress.State,
                      o.TotalPrice,
                      line.Value
                    }

执行连接的方法似乎有效,但是当我访问返回的 IQueryable 时,我得到一个NotSupportedException :无法创建“System.Collections.Generic.KeyValuePair`2”类型的常量值。此上下文中仅支持原始类型或枚举类型。

我做错了什么?

最佳答案

您的IQueryable实际上是一个专门的 Entity Framework 实现,它在迭代时尝试通过检查表达式树来构造SQL查询,执行该查询,并返回结果的可枚举。这是脆弱的,您的投影和查询不能任意复杂,否则表达式 -> SQL 转换器不知道如何处理它。

首先通过具体化您的 IQueryable 来解决这个问题很好,但您甚至不需要这样做。当您想要的是一个将订单 ID 映射到一堆数据的字典时,为什么还要有一个本质上是元组的列表呢?

IDictionary<int, string> orderLines = new Dictionary<int, string>();

// Add a dummy item
orderLines[1234] = "Hello, this, is, a, test";

// Get your combined view
// Assuming you have an order with 1234 as the ID, this should work
var result = from o in orders
             select new
             {
                 o.OrderNum
                 o.OrderDate,
                 o.Customer.CustomerFullName,
                 o.DeliverAddress.State,
                 o.TotalPrice,
                 Products = orderLines[o.OrderID]
             }

关于c# - 连接来自 IQueryable 和 IList<KeyValuePair> 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28711056/

相关文章:

c# - 当我需要使用带有多个参数的 POST 方法而不是单独的模型时?

c# - View 和 View 模型之间的快捷方式(Visual Studio 2012)

c# - 正则表达式,定位一个字符,但如果它是某个单词的一部分则不定位

c# - 使用 LINQ 的结构与类

c# - 将文本中的 SQL 返回到 Entity Framework 中的模型

c# - 聚合多维数组

c# - 将 IList<DateTime> 中的连续日期组合成范围

c# - Entity Framework 尝试在添加条目时显式添加 ID

asp.net-mvc - 使用 MvcMiniProfiler 分析 Entity Framework

entity-framework - 如何修复 .Net Core POST 操作中的 400 Bad Request 错误?