错误:IAsyncEnumerable不能用于实体框架上的IEnumerable类型的参数

时间:2019-11-18 14:29:03

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

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

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

第二个示例相反,首先获取存储在“成员”表中的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,我遇到了一个错误:

Error

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

使用第二个LINQ表达式:如果我从第二个表达式中删除了“ await”关键字,最后我执行了ToList()而不是ToListAsync(),那么效果很好。我确实了解问题是异步执行。但是,如何使最后一位作为异步执行,为什么使用First LINQ表达式不会发生该问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

它在抱怨这部分:

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

由于您正在Union(即List<T>)上进行IEnumerable,因此Union将只接受IEnumerable作为参数。但是s.MemberAdditionalCards.Select()返回IAsyncEnumerable

我不确定在Linq表达式中是否喜欢await,因此,如果不喜欢,请删除await并将ToListAsync()更改为{{1} }:

ToList()

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

答案 1 :(得分:0)

如果希望在单个查询中解决linq,最好删除select表达式中的所有.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();