簡體   English   中英

Entity Framework Core 3.5.1 中的 Linq 查詢

[英]Linq query in Entity Framework Core 3.5.1

我已經在 EF Core 中嘗試了此查詢的所有變體,但我無法弄清楚。
我已將其簡化為:

發票表

發票編號 東西
1 一個
2

發票日志表

ID 發票編號 日期 個人身份
1 1 2015 年 11 月 12 日 1
2 2 2018 年 1 月 20 日 2
3 2 2019 年 3 月 15 日 3

人表

ID 姓名
1 鮑勃
2 史蒂夫

這是我的問題

var vm = (from i in _context.Invoice                      
                   join l in _context.InvoiceLog on i.InvoiceId equals l.InvoiceId
                  **//this is returning multiple records, how do I return only the one with the Min(Date)**

                  join pl in _context.Person on l.UpdateUserId equals pl.PersonId                     
                   select new InvoiceViewModel
                   {
                       InvoiceId = i.InvoiceId,       
                       SubmitterName = pl.FirstName + " " + pl.LastName,
                   }).ToList();

ex> 對於發票 2,這應該返回一個 InvoiceLog 記錄,其最小日期為 2018 年 1 月 20 日和史蒂夫的人名。

這是我得到的錯誤:

System.InvalidOperationException HResult=0x80131509 消息=處理 LINQ 表達式'DbSet.GroupJoin(外部:DbSet,內部:i => i.InvoiceId,outerKeySelector:l => l.InvoiceId,innerKeySelector:(i,lj)=> new { i = i, lj = lj })' 通過'NavigationExpandingExpressionVisitor' 失敗。 這可能表示 EF Core 中的錯誤或限制。
有關詳細信息,請參閱https://go.microsoft.com/fwlink/?linkid=2101433 源=Microsoft.EntityFrameworkCore

除了使用join ,您可以使用交叉連接,方法是使用from兩次並將第二個源過濾到匹配的InvoiceLog行,然后取最低的一個:

var vm = (from i in _context.Invoice
          from l in (from l2 in _context.InvoiceLog
                     where i.InvoiceId == l2.InvoiceId
                     orderby l2.Date
                     select l2).Take(1)
          join pl in _context.Person on l.UpdateUserId equals pl.Id
          select new InvoiceViewModel {
              InvoiceId = i.InvoiceId,
              SubmitterName = pl.Name
          }).ToList();

注意:EF Core 5 支持使用OrderByTake過濾包含,因此您可以在InvoiceInvoiceLog之間設置適當的關系,然后只Include您需要的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM