我正在使用EF Core 2.0.1。我正在尝试获取最后的订单数据以及用户信息以填充UserDto,如下所示,
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav>
<div></div>
<div></div>
<div></div>
</nav>
<div>This element won't move or be affected when the popup shows</div>
这引发以下异常。我该如何解决这个问题?
(from u in DbContext.User.Where(u => u.UserId == userId)
let last = u.Orders.LastOrDefault()
select new UserDto
{
Id = u.Id,
Name = u.Name,
LastOrderId = (last == null ? null : last.Id),
LastOrderDate = (last == null ? null : last.Date)
}
答案 0 :(得分:3)
您的查询正式没有任何问题。但是虽然EF Core尝试翻译Last
/ LastOrDefault
方法(EF6只会抛出NotSupportedException
),但显然它仍然存在问题。
问题是Last
/ LastOrDefault
没有为数据库原始序列定义,这些序列本质上是无序的。
很快,请避免Last
/ LastOrDefault
。请改用OrderByDescending
+ First
/ FirstOrDefault
。
以下作品:
let last = u.Orders.OrderByDescending(o => o.Date).FirstOrDefault()
只需使用适合您的数据逻辑的排序列来确定应该是“第一”,“最后”等等。
实际上这也有效:
let last = u.Orders.OrderBy(o => o.Date).LastOrDefault()
但是EF Core会尝试将其转换为前面提到的构造,因此比明确的方式更容易出现EF Core实现错误。