EF Core使用Let in query throw“Argument types not match”异常

时间:2018-03-31 07:23:44

标签: c# entity-framework entity-framework-core

我正在使用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)
}

1 个答案:

答案 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实现错误。