最近玩EFCore 6,发生了一个诡异的问题。封装好的代码,在一个简单的Where后发现取回来的结果数量确是对的,但列表里的每一个记录内容都一样。
sql如下:
select * from project_cost
where year_month>=202201 and year_month<=202201 and project_id=1
这个是再简单不过的sql了,我到数据库里查一下,没问题。是返回了62条记录并且每条记录里的信息都不一样。
但在.NET Core里,我发现确实是返回了62条数据,但每条数据的内容都完全一模一样!于是开始我的各种神奇debug之旅。
1. 排查SQL问题
刚开始就怀疑是不是sql有问题。于是找网上的教程开打印sql的debug方式,结果没有一个好用的。后来发现了一个方式,可以在代码里debug出来要执行的sql。
代码如下:
/// <summary>
/// Gets objects from database by filter.
/// </summary>
/// <param name="predicate">Specified a filter</param>
/// <returns></returns>
public virtual async Task<IQueryable<TEntity>> WhereAsync(Expression<Func<TEntity, bool>> predicate)
{
return await Task.Run(() =>
{
var result = _dbSet.Where<TEntity>(predicate).AsQueryable<TEntity>();
var sql = result.To

本文讲述了作者在使用EFCore 6时遇到的诡异问题,封装代码查询结果数量正确但记录内容相同。作者通过排查SQL、视图问题,最终发现是视图中ID字段被EFCore默认为主键导致。还验证了EFCore可能是将同一对象塞进列表以提高性能和内存利用率。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



