EF Core如何基于一对多多侧条件查询对应1侧实体数据
原有代码问题说明
- EF Core的
Contains方法仅支持判断实体是否存在于集合中,不支持传入lambda表达式作为筛选条件,属于语法错误 - 实体
Payment中定义的唯一字段为Token,原有查询中使用的vandarToken字段名与实体定义不匹配 Order实体中定义的Payment集合导航属性拼写为Paymants,与原有查询中写的Payments不一致
正确实现方案
方案1:从Order表查询(符合原有写法逻辑)
// 需要配合await关键字调用异步方法 var order = await _dbContext.Orders .Include(o => o.Paymants) .SingleAsync(o => o.Paymants.Any(p => p.Token == Token));
方案2:从Payment表反向查询(性能更优)
因为Token是唯一值,直接从Payment表过滤后关联查询Order,不需要遍历所有Order的Payment集合,查询效率更高:
var order = await _dbContext.Payments .Where(p => p.Token == Token) .Select(p => p.Order) // 如果不需要加载Order关联的所有Payment,可以删除下面这行Include .Include(o => o.Paymants) .SingleAsync();
额外优化建议
- 建议修正
Order实体中导航属性的拼写错误,将Paymants改为标准拼写Payments,避免后续开发出现拼写类低级错误 - 如果需要兼容Token不存在时不抛出异常,可以将
SingleAsync替换为SingleOrDefaultAsync,查询不到时会返回null
内容的提问来源于stack exchange,提问作者M Taher
相关产品推荐
相关产品推荐

