0

我有这两个 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 表达式不会发生这个问题?

谢谢!

4

2 回答 2

0

如果您希望在单个查询中解决 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();
于 2019-11-19T14:39:38.113 回答
0

它抱怨这部分:

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

由于您正在Union对 a List<T>(即IEnumerable)进行操作,Union因此只会接受 aIEnumerable作为参数。但s.MemberAdditionalCards.Select()回报IAsyncEnumerable

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

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

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

于 2019-11-18T14:47:55.400 回答