[英]Entity Framework Core linq query returns InvalidCastException
[英]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 支持使用OrderBy
和Take
過濾包含,因此您可以在Invoice
和InvoiceLog
之間設置適當的關系,然后只Include
您需要的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.