繁体   English   中英

如何将 SQL 查询转换为 LINQ(以获取每个预订状态的最后记录)

[英]How to Convert SQL query to LINQ (to get last record each bookingStatus)

需要一些帮助将以下查询翻译成 LINQ。

;With BookingWithLastStatus 
as
(
    Select *, Rnk = ROW_NUMBER() over (partition by BookingId order by Id desc)
    from BookingStatus
)
 
Select * 
from BookingWithLastStatus
where Rnk=1 AND StatusId = 3

我已经完成了下面的 LINQ 但它没有得到正确的记录。

var BookStatus = from p in _context.Set<BookingStatus>()
   where p.StatusId == 3
   group p by p.BookingId into opt
   select new {
       BookingId = opt.Key,
       Id = opt.Max(x => x.Id)
   };

SQL 查询仅获得 1 条正确记录,而我的 LINQ 获得多条记录。

更新:

我确实喜欢这样:

先获取所有的BookingStatus

var GetAllBookStatus = await _context.Set<BookingStatus>() 
.ToListAsync();

然后根据我需要的 SQL 查询进行过滤。

                var FilteredBookStatus = GetAllBookStatus
                    .OrderByDescending( x => x.Id )
                    .GroupBy(person => person.BookingId)   
                    .Select( group => new { Group = group, Count = group.Count() } )
                    .SelectMany( groupWithCount =>
                        groupWithCount.Group.Select( b => b)
                        .Zip(
                            Enumerable.Range( 1, groupWithCount.Count ),
                            ( b, i ) => new { 
                                b.Id,
                                b.BookingId,
                                b.BookingMWABId, 
                                b.BookStatus,
                                b.CreatedBy,
                                b.CreatedDate,
                                b.Destination,
                                b.InternalStatus,
                                b.LineNum,
                                b.ModifiedBy,
                                b.ModifiedDate,
                                b.Module,
                                b.ReasonCode,
                                b.ReceivedBy,
                                b.RefNo,
                                b.StatusId,
                                b.TimeStamp,
                                RowNumber = i }
                        )
                    )
                    .Where(a => a.StatusId == 3 && a.RowNumber == 1)
                    .ToList();

但是我对获取所有记录不太有信心,因为它会增长一段时间。 我可以从我的代码中更改什么吗?

使用 EF core 6.x,您可以执行以下操作。 这不是您的 SQL 中的最佳情况,但应该可以工作:

var BookStatus = 
    from p in _context.Set<BookingStatus>()
    group p by p.BookingId into g
    select g.OrderByDescending(x => x.Id).First();

BookStatus = BookStatus.Where(p => p.StatusId == 3);

或另一种变体

var BookStatus = _context.Set<BookingStatus>().AsQueryable();

BookStatus = 
    from d in BookStatus.Select(d => new { d.BookingId }).Distinct()
    from p in BookStatus
        .Where(p => p.BookingId == d.BookingId)
        .OrderByDescending(p => p.Id)
        .Take(1)
    select p;

BookStatus = BookStatus.Where(p => p.StatusId == 3);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM