【发布时间】:2020-01-25 21:27:33
【问题描述】:
我遇到需要对 Include 对象执行 OrderBy 的情况。这就是我迄今为止尝试过的方式
Customers query = null;
try
{
query = _context.Customers
.Include(x => x.CustomerStatus)
.ThenInclude(x => x.StatusNavigation)
.Select(x => new Customers()
{
Id = x.Id,
Address = x.Address,
Contact = x.Contact,
Name = x.Name,
CustomerStatus = new List<CustomerStatus>
{
x.CustomerStatus.OrderByDescending(y => y.Date).FirstOrDefault()
}
})
.FirstOrDefault(x => x.Id == 3);
}
catch (Exception ex)
{
throw;
}
上面的代码成功地订购了包含元素,但它不包括它的子表。 例如:客户包括 CustomerStatus 但 CustomerStatus 不包括 StatusNavigation 表。
我什至试过这个,但它都帮不了我
_context.Customers
.Include(x => x.CustomerStatus.OrderByDescending(y => y.Date).FirstOrDefault())
.ThenInclude(x => x.StatusNavigation).FirstOrDefault(x => x.Id == 3);
我做错了什么,请指导我
即使我尝试过这种方式
var query = _context.CustomerStatus
.GroupBy(x => x.CustomerId)
.Select(x => x.OrderByDescending(y => y.Date).FirstOrDefault())
.Include(x => x.StatusNavigation)
.Join(_context.Customers, first => first.CustomerId, second => second.Id, (first, second) => new Customers
{
Id = second.Id,
Name = second.Name,
Address = second.Address,
Contact = second.Contact,
CustomerStatus = new List<CustomerStatus> {
new CustomerStatus
{
Id = first.Id,
CustomerId = first.CustomerId,
Date = first.Date,
StatusNavigation = first.StatusNavigation
}
},
}).FirstOrDefault(x => x.Id == 3);
但这会击中数据库 3 次并将结果过滤到内存中。 首先从客户状态中选择所有数据,然后从状态中选择所有数据,然后从客户中选择,然后过滤内存中的所有数据。有没有其他有效的方法来做到这一点??
【问题讨论】:
-
我们需要查看您的实体类。
-
@ChrisPratt - 我已经更新了我的问题,请看一下
标签: c# entity-framework linq asp.net-core