【问题标题】:WHERE condition with SELECT, MAX statement using LINQ/Lambda使用 LINQ/Lambda 的 SELECT、MAX 语句的 WHERE 条件
【发布时间】:2019-02-26 13:39:54
【问题描述】:

我正在尝试将以下 SQL 查询转换为 C# 中的 LINQ/Lambda

SELECT DISTINCT M.InternalID, P.Code
    FROM (
        dbo.MeasureValue MV
        INNER JOIN dbo.Measure M ON MV.MeasureID = M.ID
        INNER JOIN dbo.Provider P ON MV.ProviderID = P.ID
    )
    WHERE MV.ReportingDate = (
        SELECT MAX(ReportingDate)
        FROM (
            SELECT ReportingDate
            FROM dbo.MeasureValue
            WHERE MeasureID = MV.MeasureID
        )  MaxReportingDate
    );

到目前为止,

    (from MV in MeasureValues
join M in Measures on MV.MeasureID equals M.ID
join P in Providers on MV.ProviderID equals P.ID
Where //???
select new //Distinct?? 
{  M.InternalID, P.Code} )

有人可以指导我如何在 SQL 查询中使用嵌套的 WHERE 条件,并在整体上执行嵌套 SELECT 和 DISTINCT 的 MAX 吗?

作为一个整体,LINQ/Lamda 应该输出与 SQL 查询相同的结果。

*我是 SQL 和 LINQ 的新手

提前致谢。

【问题讨论】:

  • 也许通过ReportingDate desc 订购并选择First(或FirstOrDefault)? (除非几行可能有相同的日期)
  • 我将按该子选择进行分组,获取带有 MeasureId 和 MaxReportingDate 的两列。然后,您可以将该数据与您的主查询连接起来。顺便说一句,这也是您可以/应该对 SQL 查询进行的操作(更好的性能)
  • 可以使用Linqer将SQL查询转换为Linq
  • @FortyTwo 该产品只有试用版,不能免费使用。
  • 你应该尝试转换的 SQL 是这个:select MV.* from (select MeasureID, Max(ReportingDate) MaxReportingDate from MeasureValue group by MeasureID) maxValues inner join MeasureValue mv on maxValues.MeasureID = mv.MeasureID and mv.ReportingDate = maxValues.maxReportingDate

标签: c# sql-server linq lambda


【解决方案1】:

试试这个:

var query = 
    from mv in MeasureValues
    join m in Measures on mv.MeasureID equals m.ID
    join p in Providers on mv.ProviderID equals p.ID
    where mv.ReportingDate == 
        (from mv2 in MeasureValues
        where mv2.MeasureID == mv.MeasureID
        orderby mv2.ReportingDate descending
        select mv2.ReportingDate
        ).FirstOrDefault()
    select new { m.InternalID, p.Code };

var distinct = 
    from q in query
    group q by new { q.InternalID, q.Code} into gr
    select new 
    { 
        InternalID = gr.First().InternalID, 
        Code = gr.First().Code 
    };

var result = distinct.ToList();

另一个查找最大值ReportingDate的选项:

var query = 
    from mv in MeasureValues
    join m in Measures on mv.MeasureID equals m.ID
    join p in Providers on mv.ProviderID equals p.ID
    where mv.ReportingDate == MeasureValues.Where(x => x.MeasureID == mv.MeasureID).Select(x => x.ReportingDate).Max()
    select new { m.InternalID, p.Code };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多