You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Максим Горностаев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:48:03