【问题标题】:Transform this LINQ expression to SQL server query将此 LINQ 表达式转换为 SQL 服务器查询
【发布时间】:2019-11-21 20:40:13
【问题描述】:

我在实体框架中使用 LINQ 方法编写了这个查询:

var items = db.Items.ToList();

var unique_items = items.OrderBy(c => c.date)
              .GroupBy(c => c.title)
              .Select(group => group.First()).ToList();

Items 返回这个例如:

id   title  date
-----------------------
 1   car1   02-05-2019
 2   car2   02-06-2019
 3   car2   02-07-2019
 4   car4   02-05-2019
 5   car1   02-04-2019

并且 unique_items 应该返回这个:

1   car1   25-10-2019
3   car2   25-10-2019
4   car4   25-12-2019

我只想要独特的标题。

我现在想使用 SQL Server 查询在数据库中创建一个视图,我尝试使用 Group ByDistinct 但我不能这样做,因为使用不同于 LINQ 查询有人可以请帮忙?

【问题讨论】:

  • create view your_view_name as Select min(id) as id, title, min(date) as date from your_table group by title
  • @МаксимИванов 这只有在每个 min(id) 和每个 min(date) 指向同一记录时才是正确的。
  • 简单的答案是使用 DbContext.Log 来捕获正在生成的 SQL 并使用它。 docs.microsoft.com/en-us/ef/ef6/fundamentals/…
  • @Robert McKee 是的。但他想要独特的头衔——他得到独特的头衔。目前还不清楚必须是什么日期和 ID。我建议花几分钟。
  • @МаксимИванов 他得到了唯一的标题,对于每个唯一的标题,他得到最早的日期,以及与该最早日期对应的 id。这就是他的代码目前所做的。虽然,鉴于他的示例输入,他的示例结果是错误的。

标签: c# sql-server linq entity-framework-6


【解决方案1】:

类似于以下内容,但我会使用 EF6's logging 来捕获查询并按原样使用:

SELECT id, title, date
FROM (
  SELECT id,title,date, ROW_NUMBER() OVER (PARTITION BY title ORDER BY date) AS rn 
  FROM Items
) t1 
WHERE t1.rn=1
ORDER BY date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多