private static void Functions()
        {
            using var context = new NullSemanticsContext();

            #region Functions
            var query = context.Entities.Where(e => e.String1.Substring(0, e.String2.Length) == null);
            #endregion

            var result = query.ToList();
        }
        static void ManualOptimization()
        {
            using var context = new NullSemanticsContext();

            #region ManualOptimization
            var query1 = context.Entities.Where(e => e.String1 != e.String2 || e.String1.Length == e.String2.Length);
            var query2 = context.Entities.Where(e => e.String1 != null && e.String2 != null && (e.String1 != e.String2 || e.String1.Length == e.String2.Length));
            #endregion

            var result1 = query1.ToList();
            var result2 = query2.ToList();
        }
        private static void BasicExamples()
        {
            using var context = new NullSemanticsContext();
            #region BasicExamples
            var query1 = context.Entities.Where(e => e.Id == e.Int);
            var query2 = context.Entities.Where(e => e.Id == e.NullableInt);
            var query3 = context.Entities.Where(e => e.Id != e.NullableInt);
            var query4 = context.Entities.Where(e => e.String1 == e.String2);
            var query5 = context.Entities.Where(e => e.String1 != e.String2);
            #endregion

            var result1 = query1.ToList();
            var result2 = query2.ToList();
            var result3 = query3.ToList();
            var result4 = query4.ToList();
            var result5 = query5.ToList();
        }
        private static void Main(string[] args)
        {
            using var context = new NullSemanticsContext();
            context.Database.EnsureDeleted();
            context.Database.EnsureCreated();

            //#region FunctionSqlRaw
            //context.Database.ExecuteSqlRaw(
            //    @"create function [dbo].[ConcatStrings] (@prm1 nvarchar(max), @prm2 nvarchar(max))
            //        returns nvarchar(max)
            //        as
            //        begin
            //            return @prm1 + @prm2;
            //        end");
            //#endregion

            //BasicExamples();
            Functions();
            //ManualOptimization();
        }