【问题标题】:How to get record with max date with join?如何通过加入获得最大日期的记录?
【发布时间】:2019-08-20 02:06:57
【问题描述】:

如何在 LINQ 中做到这一点?

select  MAX(d.DepartureDateRange),MAX(d.ReturnDateRange)   
from Tour t join
TourCategory tc on t.ID = tc.TourID
join TourDates td on t.ID = td.TourID
join Dates d on d.ID = td.DatesID
where tc.CategoryID = 3 and t.ID = 12 

数据库图在这里->

例如加入是这样的,但我无法获得最大的 DepartureDateRange 和 ReturnDateRange

var query2 = from t in db.Tour
    join tc in db.TourCategory on t.ID equals tc.TourID
    join td in db.TourDates on t.ID equals td.TourID
    join d in db.Dates on td.DatesID equals d.ID
    where tc.CategoryID == 3
    select new IndexTour
    {
        ID = t.ID,
        TourName = t.TourName,
        //DepartureDateRange = 
        //ReturnDateRange = 
        Description = t.SmallDesc,
        Price = t.Price,
        CoverPhotoUrl = t.CoverPhotoUrl,
        TourProgram = t.TourDesc
    };

提前致谢。

【问题讨论】:

  • 您的 SQL 返回一行有两条记录(按整个数据集分组),但 LINQ 表达式返回 IndexTour 列表。您是否需要每个 Tour 的最大日期或整个选择的最大日期(根据 SQL)?
  • 感谢您的回答。我需要每个巡回赛的最大日期。
  • 我猜到那时你需要组队
  • 也许我的SQL to LINQ Recipe 对你有帮助?

标签: c# sql linq


【解决方案1】:

在这里(日期按旅游分组):

var query2 = 
    from t in db.Tour
    join tc in db.TourCategory on t.ID equals tc.TourID
    where tc.CategoryID == 3
    // join dates aggregates grouped by tour id
    join tdates in
        from td in db.TourDates 
        join d in db.Dates on td.DatesID equals d.ID
        group d by td.TourID into grp
        select new 
        { 
            tourID = grp.Key, 
            departure = grp.Max(g => g.DepartureDateRange), 
            rtrn = grp.Max(g => g.ReturnDateRange)
        }
    on t.ID equals tdates.tourID
    select new IndexTour
    {
        ID = t.ID,
        TourName = t.TourName,
        DepartureDateRange = tdates.departure,
        ReturnDateRange = tdates.rtrn,
        Description = t.SmallDesc,
        Price = t.Price,
        CoverPhotoUrl = t.CoverPhotoUrl,
        TourProgram = t.TourDesc
    };

【讨论】:

    【解决方案2】:

    认为这就是你想要的?

    var dateRanges = tours
        .Join(tourCategories,
            t => t.Id,
            tc => tc.TourId,
            (t, tc) => (t, tc))
        .Join(tourDates,
            ttc => ttc.t.Id,
            td => td.TourId,
            (ttc, td) => (ttc, td))
        .Join(dates, 
            ttctd => ttctd.td.DateId,
            d => d.Id,
            (ttctd, d) =>
            new {
                TourId = ttctd.ttc.t.Id,
                CategoryId = ttctd.ttc.tc.CategoryId,
                DepartureDateRange = d.DepartureDateRange,
                ReturnDateRange = d.ReturnDateRange
            });
    
    var filtered = dateRanges
        .Where(r => r.CategoryId == 3 && r.TourId == 12);
    
    var maxDepartureDateRange = filtered.Max(d => d.DepartureDateRange);
    var maxReturnDateRange = filtered.Max(d => d.ReturnDateRange);
    

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 2021-03-17
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2012-02-12
      • 2019-06-04
      相关资源
      最近更新 更多