EF异步操作报错:IQueryable未实现IAsyncEnumerable的解决方案求助
EF异步操作报错:IQueryable未实现IAsyncEnumerable的解决方案求助
各位大佬好,我在测试自己写的方法时碰到了一个EF异步操作的异常,折腾了好久试了不少网上的方案都没解决,来求助大家!
具体报错信息如下:
System.InvalidOperationException : The source 'IQueryable' doesn't implement 'IAsyncEnumerable<<>f__AnonymousType4`2[Domain.DbEntities.User, System.DateTime]>'. Only sources that implement 'IAsyncEnumerable' can be used for Entity Framework asynchronous operations
这是我的业务代码:
public async Task<List<User>> GetInactiveUsers(IUserRepository userRepository, IMeetingRepository meetingRepository, int daysThreshold) { var usersWithLastActivity = await userRepository.Queryable() .Select(user => new { User = user, LastMeetingDate = meetingRepository.Queryable() .Where(meeting => meeting.UserMeetings.Any(userMeeting => userMeeting.UserId == user.Id)) .OrderByDescending(meeting => meeting.MeetingAt) .Select(meeting => meeting.MeetingAt) .FirstOrDefault() }) .ToListAsync(); return usersWithLastActivity .Where(userWithDate => { if (userWithDate?.LastMeetingDate == null) return false; var daysSinceLastActivity = (DateTime.UtcNow.Date - userWithDate.LastMeetingDate.Date).Days; return daysSinceLastActivity == daysThreshold; }); }
对应的测试类代码:
public async Task GetInactiveUsers_ReturnsCorrectUsers() { // Arrange var users = new List<User> { new() { Id = 1, UserName = "User1" }, new() { Id = 2, UserName = "User2" }, new() { Id = 3, UserName = "User3" } }; var meetings = new List<Meeting> { new() { Id = 1, MeetingAt = DateTime.UtcNow.AddDays(-7), UserMeetings = new List<UserMeeting> { new() { UserId = 1 } } }, new() { Id = 2, MeetingAt = DateTime.UtcNow.AddDays(-10), UserMeetings = new List<UserMeeting> { new() { UserId = 2 } } }, new() { Id = 3, MeetingAt = DateTime.UtcNow.AddDays(-3), UserMeetings = new List<UserMeeting> { new() { UserId = 3 } } } }; var mockUserRepository = new Mock<IUserRepository>(); mockUserRepository.Setup(repo => repo.Queryable()).Returns(users.AsQueryable()); var mockMeetingRepository = new Mock<IMeetingRepository>(); mockMeetingRepository.Setup(repo => repo.Queryable()).Returns(meetings.AsQueryable()); var service = new NotificationOfInactiveUsersHostedService( new Mock<IServiceProvider>().Object, new Mock<ILogger<NotificationOfInactiveUsersHostedService>>().Object ); // Act var result = await service.GetInactiveUsers(mockUserRepository.Object, mockMeetingRepository.Object, 7); // Assert Assert.Single(result); Assert.Equal(7, (DateTime.UtcNow.Date - meetings.First(m => m.UserMeetings.Any(um => um.UserId == result.First().Id)).MeetingAt.Date).Days); }
我在网上搜了好多相关的解决案例,试了各种方法但都没搞定这个问题,希望各位能帮我排查下问题根源,给出修复思路啊!
备注:内容来源于stack exchange,提问作者Максим Горностаев
相关产品推荐
相关产品推荐

