实体框架核心-这可能表示EF核心存在错误或限制

时间:2020-03-01 10:15:32

标签: asp.net linq entity-framework-core

我想从用户那里加载最新的私人聊天消息。

我的代码以加载最新消息

 public async Task<List<UserChatMessage>> GetUserPrivateChatMessagesAsync(string userId, string userChatPartnerId, int limit, int skip, CancellationToken cancellationToken) {
      cancellationToken.ThrowIfCancellationRequested();
      if (userId == null) throw new ArgumentNullException(nameof(userId));
      if (userChatPartnerId == null) throw new ArgumentNullException(nameof(userChatPartnerId));

      return await this.Context.Messages
        .OrderBy(d => d.CreatedDate)
        .AsNoTracking()
        .Include(p => p.UserChatPartner)
        .Where(u => u.UserId == userId && u.UserChatPartnerId == userChatPartnerId || u.UserChatPartnerId == userId && u.UserId == userChatPartnerId)
        .TakeLast(limit)
        .Skip(skip)
        .ToListAsync(cancellationToken);
    }

以下代码抛出此错误:

System.InvalidOperationException: Processing of the LINQ expression 'DbSet<UserChatMessage>
    .OrderBy(d => d.CreatedDate)
    .Include(p => p.UserChatPartner)
    .Where(u => u.UserId == __userId_0 && u.UserChatPartnerId == __userChatPartnerId_1 || u.UserChatPartnerId == __userId_0 && u.UserId == __userChatPartnerId_1)
    .TakeLast(__p_2)' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.

我将.Take更改为.TakeLast,现在我得到了描述的错误。

UserChatMessage的数据库结构 Database strcuture of UserChatMessage
我也尝试将ToListAsync更改为AsEnumerable,但未成功。
我希望有人能够理解错误并为我提供帮助。

先谢谢了。
蒂莫(Timo)

1 个答案:

答案 0 :(得分:2)

该错误表示您遇到了当前的EF Core错误或限制。

我将.Take更改为.TakeLast,现在我得到了描述的错误。

所以您知道导致问题的原因。通常,避免使用名称为Last的LINQ方法(例如LastLastOrDefaultTakeLast)-这些方法在SQL世界中没有直接的等效项,因此有更大的机会击中bug /限制(或只是不受支持)。

相反,请颠倒顺序并使用相应的First方法。

将其应用于您的案例意味着替换

.OrderBy(d => d.CreatedDate)

使用

.OrderByDescending(d => d.CreatedDate)

.TakeLast(limit)

使用

.Take(limit)