c# - ODAC/Oracle 等同于 Linq to Entities GroupBy FirstOrDefault

标签 c# oracle entity-framework linq odac

我已经多次回到这个问题并在谷歌上搜索了几个小时。即使是现在,写这篇文章时,上面建议的重复也没有帮助。

我正在使用以下软件:

  • .Net Framework 4.5
  • Oracle 11.2.0.3.0(显然)
  • Entity Framework 5.0
  • MVC 4
  • ODAC 12C(不确定这是否是足够的信息)

所以我有这个表,它包含一个 ID 列(但这不是唯一的!)、一些其他列和一个“订单”列(编号 2,0)。我正在尝试选择按 ID 分组的“订单”列中编号最小的所有内容。

这个有效:

query.GroupBy(item => item.Id).Select(item => item.Min(t => t.Order));

但它给了我一个只有整数的 IEnumerable(通常是一个数字为 1 的完整列表)

我需要完整的实体,所以我试试这个:

query.GroupBy(item => item.Id).Select(item => item.OrderBy(t => t.Order).FirstOrDefault());

这给了我以下异常:

“Oracle 11.2.0.3.0 不支持 APPLY”

因此,显而易见的解决方案可能是更新上面列出的一些内容。但是:这不是一个选择

我想我可以只选择唯一键(这是 ID、订单和开始日期列,是的......不要问)。但我该怎么做呢?

这显然是错误的:

query.GroupBy(item => item.Id).Select(item => new { item.Min(t => t.Order), item.Min(t => t.Id), item.Min(t => t.StartDate) });

因为它会选择所有这些值的最小值,而我想要属于具有最低订单号的行的值。所以这将是第一个问题:我如何进行选择?

第二个问题:如何获得与这些唯一键相关的完整实体?我可以一次选择查询吗?我应该使用 list.contains 吗?

有什么建议吗?

最佳答案

看起来您有一个无法在单个 select 语句中查询的表结构。您有两种选择:

  1. 嵌套选​​择
  2. 内存中过滤器

方案一(嵌套选择)

var intermediateResult = query
  .GroupBy(item => item.Id)
  .Select(item => new { item.Min(t => t.Order), item.Key })
  .ToArray();

这为您提供了一个 (Order, Id) 数组,您可以在后续查询中使用该数组。

方案二(内存过滤器)

var result = query
  .GroupBy(item => item.Id)
  .Select(item => item.OrderBy(t => t.Order))
  .ToArray()
  .Select(item => item.First());</code></pre>

这会将所有记录加载到内存中,并对结果数组使用 First(),这可能不是一个选项,具体取决于行数。

关于c# - ODAC/Oracle 等同于 Linq to Entities GroupBy FirstOrDefault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38325580/

相关文章:

java - ORA-00905: 缺少关键字 Hibernate 查询 Oracle

c# - EF 6 SaveChanges 具有对同一(已更改)对象的多个引用

c# - 将 EntityFramework 6.0.0.0 还原为 5.0.0.0

c# - 如何使用 XmlSerializer 生成标签前缀

c# - 将具有命名过滤器的ElasticSearch聚合查询转换为NEST C#

c# - 如何在客户端使用接口(interface)注入(inject)WCF服务?

c++ - PL/SQL - 设置空值

sql - 具有不同数据类型的案例语句

asp.net-mvc-3 - 我应该在 Entity Framework 连接字符串中使用 Pooling=False 吗?

带点的 C# 类字段名称