簡體   English   中英

取組的每個第一個元素

[英]Take each first element of the group by

如何使用 EF 5 獲取組中的每個第一個元素?

      var result = await context.SomeDbSet
          .Where(...)
          .GroupBy(x => new { x.SomeField, ... })
          .Select(x => x.First())
          .ToListAsync();

我得到不支持的異常。

如何正確重寫查詢? 謝謝。

你不能通過分組來做到這一點。 SQL 有一個限制 - 使用GROUP BY你可以 select 只分組鍵和聚合結果。 此限制肯定擴展到LINQ to Entities - 在GroupBy之后,您可以 select 僅分組鍵和聚合結果。

這樣的結果可以通過 SQL 和 Window 函數來實現:

SELECT
  r.*,
FROM 
(
   SELECT 
      s.*, 
      ROW_NUMBER() OVER(PARTITION BY s.SomeField1, s.SomeField2 ORDER BY s.SomeDate) AS RN
   FROM SomeDbSet s
   WHERE ...
) r
WHERE r.RN = 1

對於那些想留在 LINQ 的人,我建議擴展(免責聲明:我是擴展創建者) linq2db.EntityFrameworkCore

您可以通過 LINQ 在上面編寫查詢

var rnQuery = 
   from s in context.SomeDbSet
   where ...
   select new 
   {
      Data = s,
      RN = Sql.Ext.RowNumber().Over()
              .PartitionBy(s.SomeField1, s.SomeField2)
              .OrderBy(s.SomeDate)
              .ToValue()
   }

var resultQuery = await rnQuery
   .Where(r => r.RN == 1)
   .Select(r => r.Data)
   .ToLinqToDB();

var result = resultQuery.ToList();

// async variant may need ToListAsyncLinqToDB() call 
// because of collision in async extension methods between EF Core and linq2db
var result = await resultQuery.ToListAsyncLinqToDB();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM