EF Core,FromSqlRaw 给出与查询不同的结果
EF Core, FromSqlRaw gives different result than query
我在 dotnet 5 中使用 EF core 5,我的 FromSQLRaw 调用有这种奇怪的行为。当我调用 Table 值函数时。
我第一次调用它一切都很好,它使用我的日期参数正确,但是当我调用它更新它时,它似乎生成了正确的查询,但结果与初始调用相同, 尽管我用不同的日期来称呼它。
当我运行
query.ToQueryString()
它 returns 是我期望的查询,当 运行 在其他一些软件中使用它时,我也得到了我期望的结果。
所以我的 SQL 字符串没问题。
public async Task<List<OverUnderAfdækningModel>> HentOverUnder(DateTime date)
{
var dateParam = new SqlParameter("@Dato", date);
var query = mOHandelsDbContext.OverUnderAfdæknings.FromSqlRaw("SELECT * From [MO_Handelsdata].[OverUnder].OverUnderAfdækning(@Dato)", parameters: new[] { dateParam });
var result = await query.ToListAsync();
return result ;
}
在我的启动文件中我有
services.AddDbContext<MOHandelsDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MO_Handelsdata")));
我的服务构造函数看起来像
public OverUnderAfdækningService(MOHandelsDbContext _mOHandelsDbContext, MORammerDbContext _mORammerDbContext)
{
mOHandelsDbContext = _mOHandelsDbContext;
mORammerDbContext = _mORammerDbContext;
}
我像下面这样从 Blazor 调用服务,其中 UpdateData 绑定到一个按钮,而 SelectedDate 是一个绑定到日期选择器的 DateTime
protected override async Task OnInitializedAsync()
{
await getData();
}
async Task UpdateData()
{
OverUnderAfdækninger.Clear();
getData();
}
async Task getData()
{
OverUnderAfdækninger = await OverUnderAfdækningService.HentOverUnder(SelectedDate);
}
我的 dbcontext 看起来像
public class MOHandelsDbContext : DbContext
{
public virtual DbSet<OverUnderAfdækningModel> OverUnderAfdæknings { get; set; }
public MOHandelsDbContext(DbContextOptions<MOHandelsDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<OverUnderAfdækningModel>(builder =>
{
builder.ToTable("OverUnderAfdækningModel");
});
}
}
缓存有问题。
在查询后面添加 AsNoTracking() 为我修复了它
var query = mOHandelsDbContext
.OverUnderAfdæknings
.FromSqlInterpolated($"SELECT * From [MO_Handelsdata].[OverUnder].OverUnderAfdækning({date})")
.AsNoTracking();
我在 dotnet 5 中使用 EF core 5,我的 FromSQLRaw 调用有这种奇怪的行为。当我调用 Table 值函数时。
我第一次调用它一切都很好,它使用我的日期参数正确,但是当我调用它更新它时,它似乎生成了正确的查询,但结果与初始调用相同, 尽管我用不同的日期来称呼它。
当我运行
query.ToQueryString()
它 returns 是我期望的查询,当 运行 在其他一些软件中使用它时,我也得到了我期望的结果。 所以我的 SQL 字符串没问题。
public async Task<List<OverUnderAfdækningModel>> HentOverUnder(DateTime date)
{
var dateParam = new SqlParameter("@Dato", date);
var query = mOHandelsDbContext.OverUnderAfdæknings.FromSqlRaw("SELECT * From [MO_Handelsdata].[OverUnder].OverUnderAfdækning(@Dato)", parameters: new[] { dateParam });
var result = await query.ToListAsync();
return result ;
}
在我的启动文件中我有
services.AddDbContext<MOHandelsDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MO_Handelsdata")));
我的服务构造函数看起来像
public OverUnderAfdækningService(MOHandelsDbContext _mOHandelsDbContext, MORammerDbContext _mORammerDbContext)
{
mOHandelsDbContext = _mOHandelsDbContext;
mORammerDbContext = _mORammerDbContext;
}
我像下面这样从 Blazor 调用服务,其中 UpdateData 绑定到一个按钮,而 SelectedDate 是一个绑定到日期选择器的 DateTime
protected override async Task OnInitializedAsync()
{
await getData();
}
async Task UpdateData()
{
OverUnderAfdækninger.Clear();
getData();
}
async Task getData()
{
OverUnderAfdækninger = await OverUnderAfdækningService.HentOverUnder(SelectedDate);
}
我的 dbcontext 看起来像
public class MOHandelsDbContext : DbContext
{
public virtual DbSet<OverUnderAfdækningModel> OverUnderAfdæknings { get; set; }
public MOHandelsDbContext(DbContextOptions<MOHandelsDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<OverUnderAfdækningModel>(builder =>
{
builder.ToTable("OverUnderAfdækningModel");
});
}
}
缓存有问题。
在查询后面添加 AsNoTracking() 为我修复了它
var query = mOHandelsDbContext
.OverUnderAfdæknings
.FromSqlInterpolated($"SELECT * From [MO_Handelsdata].[OverUnder].OverUnderAfdækning({date})")
.AsNoTracking();