using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using Microsoft.EntityFrameworkCore.SqlServer;
using Microsoft.EntityFrameworkCore.Query.SqlExpressions;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System.ComponentModel.DataAnnotations.Schema;
public static void Main()
using var ctx = new MyContext();
var baseQuery = ctx.Tests;
var results = baseQuery.Where(t => MyContext.TryConvertInt(t.Value) == 1);
Console.WriteLine(results.ToQueryString());
public class MyContext : DbContext
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
optionsBuilder.UseSqlServer("Data Source=.");
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.HasDbFunction(
this.GetType().GetMethod(nameof(TryConvertInt)),
.HasParameter("value", p => p.HasStoreType("sql_variant"))
new SqlFunctionExpression(
new SqlFragmentExpression("int"),
public DbSet<TestEntity> Tests {get;set;} = null!;
public static int TryConvertInt(object value) => throw new NotImplementedException();
[Column(TypeName = "sql_variant")]
public object Value {get;set;}