【问题标题】:ODAC / Oracle Equivalent to Linq to Entities GroupBy FirstOrDefaultODAC / Oracle 等价于 Linq to Entities GroupBy FirstOrDefault
【发布时间】:2016-11-14 12:01:06
【问题描述】:

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

我正在使用以下软件:

  • .Net Framework 4.5
  • Oracle 11.2.0.3.0(显然)
  • 实体框架 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、Order 和 StartDate 列,是的......不要问)。但是我该怎么做呢?

这显然是错误的:

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 吗?

有什么建议吗?

【问题讨论】:

    标签: c# oracle entity-framework linq odac


    【解决方案1】:

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

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

    解决方案 1(嵌套选择)

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

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

    解决方案 2(内存过滤器)

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

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

    【讨论】:

    • 我已经接受了这个作为正确答案。我需要在这个答案中添加两个内容:使用 SelectMany 来展平第一个查询(它比这个示例更复杂) 仅从结果中获取唯一标识符并使​​用它来过滤最终数据。之后就很容易了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2016-04-01
    • 2013-09-03
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多