我有这两个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,我遇到了一个错误:
第一个LINQ表达式工作正常,但不是我想要的项目放在列表结果中的方式。
使用第二个LINQ表达式:如果我从第二个表达式中删除了“ await”关键字,最后我执行了ToList()而不是ToListAsync(),那么效果很好。我确实了解问题是异步执行。但是,如何使最后一位作为异步执行,为什么使用First LINQ表达式不会发生该问题?
谢谢!
答案 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();