Description
openedon Nov 1, 2018
There are significant problems when executing queries that either convert nulls in the database to non-nulls in code or vice-versa. Therefore, we have marked this feature as internal for EF Core 6.0. You can still use it, but you will get a compiler warning. The warning can be disabled with a #pragma. See #26230 for more information.
When using FromSql
to create a custom filtered data set, any column conversions defined on the DbQuery
object don't get applied.
I think the column conversions should be included automatically around the sub-query supplied to FromSql
, similar to how a sub-query is used if more predicates are added to the IQueryable
.
public class Model
{
public int Id { get; set; }
public bool Flag { get; set; }
}
public partial class MyDbContext : DbContext
{
public DbQuery<Model> Models { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Query<Models>(
entity =>
{
entity.ToView("dbo.Models");
// Convert null Flag to false on way in
entity.Property(e => e.Flag).HasConversion<bool?>(f => f, t => t ?? false);
});
}
}
// ...
var models = dbContext.Models.FromSql("SELECT * FROM dbo.Models").ToList();
This, I think, should result in SQL similar to this being executed...
SELECT [e].[Id], COALESCE([e].[Flag], 0) AS [Flag]
FROM (
SELECT * FROM dbo.Models) AS [e];
But, in reality, the plain SQL from FromSql
is executed
SELECT * FROM dbo.Models
EF Core version: 2.1.4
Database Provider: Microsoft.EntityFrameworkCore.SqlServer
Operating system: Windows 7
IDE: Visual Studio 2017 15.8.5