【问题标题】:Error: IAsyncEnumerable cannot be used for parameter of type IEnumerable on Entity framework错误:IAsyncEnumerable 不能用于实体框架上 IEnumerable 类型的参数
【发布时间】:2020-03-13 22:54:53
【问题描述】:

我有这两个 LINQ 表达式。我正在使用实体框架。唯一的区别是项目在 CardIds 列表中的位置。

第一个示例首先返回来自“MemberAdditionalCards”的 AdditionalCards,然后添加存储在 Members 表中的 Card。

第二个示例则相反,首先获取存储在 Members 表中的 Card,然后获取来自“MembersAdditionalCards”的 AdditionalCards。

第一个 LINQ:

            members = await _context.Members
                .Where(s => EF.Functions.Like(s.FirstNames, searchTerm))
                .Select(s => new Members
                {
                    Id = s.Id,
                    CardIds = s.MemberAdditionalCards
                        .Select(m => new AdditionalCard
                        {
                            CardId = m.CardId
                        })
                        .Union(new List<AdditionalCard>
                        {
                            new AdditionalCard
                            {
                                CardId = s.CardId
                            }
                        })
                        .ToList()
                })
                .AsNoTracking()
                .ToListAsync();

第二个 LINQ:

            members = await _context.Members
                .Where(s => EF.Functions.Like(s.FirstNames, searchTerm))
                .Select(s => new Members
                {
                    Id = s.Id,
                    CardIds = new List<AdditionalCard>
                    {
                        new AdditionalCard
                        {
                            CardId = s.CardId
                        }
                    }
                    .Union(s.MemberAdditionalCards
                        .Select(a => new AdditionalCard
                        {
                            CardId = a.CardId
                        }))
                    .ToList()
                })
                .AsNoTracking()
                .ToListAsync();

使用第二个 LINQ 时出现错误:

第一个 LINQ 表达式工作正常,但不是我想要的列表结果中的项目。

使用第二个 LINQ 表达式:如果我从第二个表达式中删除“await”关键字,最后我执行 ToList() 而不是 ToListAsync() 它工作得很好。我确实理解问题是异步执行。但是我怎样才能使最后一位异步执行,为什么第一个 LINQ 表达式不会发生这个问题?

谢谢!

【问题讨论】:

    标签: c# entity-framework linq asynchronous linq-method-syntax


    【解决方案1】:

    它在抱怨这部分:

    .Union(s.MemberAdditionalCards
        .Select(a => new AdditionalCard
        {
            CardId = a.CardId
        }))
    

    由于您在List&lt;T&gt;(即IEnumerable)上执行Union,因此Union 将只接受IEnumerable 作为参数。但是s.MemberAdditionalCards.Select() 返回IAsyncEnumerable

    我不确定它是否会喜欢 Linq 表达式中的 await,所以如果不喜欢,则删除 await 并将 ToListAsync() 更改为 ToList()

    .Union(await s.MemberAdditionalCards
        .Select(a => new AdditionalCard
        {
            CardId = a.CardId
        }).ToListAsync())
    

    我不确定生成的 SQL 会是什么样子。有人可能有更好的主意。

    【讨论】:

    • 感谢您的回复。我尝试了 LINQ 中的“等待”,但它不喜欢它。 .ToListAsync() 没有出现,因为我认为我没有在等待
    【解决方案2】:

    如果您希望在单个查询中解析 linq,您最好删除选择表达式中的所有 .ToList() 调用。

    试试这个:

    members = await _context.Members
        .Where(s => EF.Functions.Like(s.FirstNames, searchTerm))
        .Select(s => new Members
        {
            Id = s.Id,
            CardIds = new List<AdditionalCard>
            {
                new AdditionalCard
                {
                    CardId = s.CardId
                }
            }
            .Union(s.MemberAdditionalCards
                .Select(a => new AdditionalCard
                {
                    CardId = a.CardId
                }))
        })
        .AsNoTracking()
        .ToListAsync();
    

    【讨论】:

    • 也试过了,但没有运气。显示相同的错误
    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多