ODAC / Oracle相当于Linq to Entities GroupBy FirstOrDefault

时间:2016-07-12 09:57:46

标签: c# oracle entity-framework linq odac

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

我使用以下软件:

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

所以我有这个表,它包含一个ID列(但这不是唯一的!),其他一些列,以及一个" Order"专栏(编号2,0)。我试图在" Order"中选择编号最小的所有内容。按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,订单和StartDate列,是啊......不要问)。但是我该怎么做?

这显然是错误的:

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

因为它会选择所有这些的最小值,而我希望属于具有最低Order-number的行的值。那么这将是第一个问题:如何选择?

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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

看起来你有一个表结构,你不能在一个select语句中查询。您有两种选择:

  1. 嵌套选​​择
  2. 内存过滤器
  3. 解决方案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(),这可能不是一个选项,具体取决于行数。