【问题标题】:Linq to Entities Selecting Data with Max Date?Linq to Entities 选择具有最大日期的数据?
【发布时间】:2018-12-15 00:51:58
【问题描述】:

在选择查询中的其他列时,我在选择 maxDate 时遇到问题

这是我试图将 linq 转换为实体的查询。表表达式将返回一个 id 列表以及相应的最大插入日期

    WITH TableExpression
AS
(
SELECT   Id, Max(InsertDate) as MaxInsertDate
FROM     MyTable
WHERE    UploadDate BETWEEN '10/1/2018' AND '12/12/2018'
GROUP BY Id
)

SELECT  * 
FROM    MyTable t Join TableExpression on t.Id = TableExpression.Id
WHERE   t.InsertDate = TableExpression.MaxInsertDate    
        AND UploadDate BETWEEN '10/1/2018' and '12/12/2018' 

编辑更新:感谢下面的答案,如果我执行 .ToList();但是我需要将此查询作为联接包含在内

  var maxDateQuery = ctx.MyEntity
        .Where(m => m.InsertDate >= fromDate && m.InsertDate <= toDate)
        .ToArray()
        .GroupBy(x => x.Id)
        .Select(g => new { Id = g.Key, MaxInsertDate = g.Max(y => y.InsertDate) }).AsQueryable();

第二个问题是join子句

var mainQuery = ctx.MyTable
        .Where(m => m.InsertDate >= fromDate && m.InsertDate <= toDate).AsQueryable();



 var joinedQuery = maxDateQuery.Join(mainQuery, max => max.Id, main => main.Id, (mdq, mq) => new { maxRecords = mdq, mainRecords = mq })
                                                  .Select(joined => new
                                                  {
                                                      main = joined.mainRecords,
                                                      max = joined.maxRecords
                                                  }).ToList();

当我点击 join 语句时,我遇到了一个疯狂的错误:“此方法支持 LINQ to Entities 基础架构,不打算直接从您的代码中使用。”强>

【问题讨论】:

  • 您的最大值仅返回日期,不包含对象中的其他属性。您之前的帖子更好。为什么需要日期范围和最大值?
  • 第一个SQL查询需要转成Linq
  • 不,它没有。使用原始 SQL 或对从数据库返回的结果进行分组。这比尝试基于 LINQ 语句生成一些 SQL 更容易和更快。
  • 帖子是在我发表评论后编辑的。

标签: c# linq


【解决方案1】:

您可以在从数据库中选择记录后对内存中的结果进行分组,例如:

var maxDateQuery = ctx.MyTables
        .Where(m => m.InsertDate >= fromDate && m.InsertDate <= toDate)
        .ToArray()
        .GroupBy(x => x.Id)
        .Select(g => new { Id = g.Key, MaxInsertDate = g.Max(y => y.InsertDate)) }};

这应该给你一个IEnumerable&lt;a'&gt;,其中a'是一个匿名类型,如果你想要的话,它有一个Id和一个MaxInsertDate属性。

试图将相当复杂的 SQL 查询转换为 LINQ-To-Entities 是没有意义的。您应该像上面那样对内存中的结果进行分组,或者使用原始 SQL 查询

【讨论】:

  • 我认为您的解决方案是合适的。由于您按 ID 分组。然后选择值。
  • 这可行,但是我需要将其包含在连接中。我已经更新了原来的问题
  • 为什么?尝试将相当复杂的 SQL 语句转换为 LINQ-To-Entities 是没有意义的。要么按照我的建议对内存中的结果进行分组,要么使用原始 SQL 查询。
  • 我们的标准不允许原始查询是问题所在。使用第一个原始查询对我来说很容易,但他们希望将 EVERTHING 转换为 Linq to Entities
  • 祝你好运。 “他们”可能应该做一些学习 :) Linq-To-Entities 不是 SQL 的替代品。但是,如果您不想编写原始 SQL,则不必这样做,因为您可以使用 C# 代码对结果进行分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多