public void TableValuedPerformanceTest() { var songs = Database.MListQuery((AlbumEntity a) => a.Songs).Select(a => a.Element); var t1 = PerfCounter.Ticks; var fast = (from s1 in songs from s2 in songs from s3 in songs from s4 in songs select MinimumExtensions.MinimumTableValued( MinimumExtensions.MinimumTableValued(s1.Seconds, s2.Seconds).Select(a => a.MinValue).First(), MinimumExtensions.MinimumTableValued(s3.Seconds, s4.Seconds).Select(a => a.MinValue).First() ).Select(a => a.MinValue).First()).ToList(); var t2 = PerfCounter.Ticks; var fast2 = (from s1 in songs from s2 in songs from s3 in songs from s4 in songs let x = MinimumExtensions.MinimumTableValued(s1.Seconds, s2.Seconds).Select(a => a.MinValue).First() let y = MinimumExtensions.MinimumTableValued(s3.Seconds, s4.Seconds).Select(a => a.MinValue).First() select MinimumExtensions.MinimumTableValued(x, y).Select(a => a.MinValue).First()).ToList(); var t3 = PerfCounter.Ticks; var slow = (from s1 in songs from s2 in songs from s3 in songs from s4 in songs let x = MinimumExtensions.MinimumScalar(s1.Seconds, s2.Seconds) let y = MinimumExtensions.MinimumScalar(s3.Seconds, s4.Seconds) select MinimumExtensions.MinimumScalar(x, y)).ToList(); var t4 = PerfCounter.Ticks; if (!Schema.Current.Settings.IsPostgres) { Debug.WriteLine("MinimumTableValued: {0} ms", PerfCounter.ToMilliseconds(t1, t2)); Debug.WriteLine("MinimumTableValued let: {0} ms", PerfCounter.ToMilliseconds(t2, t3)); Debug.WriteLine("MinimumScalar: {0} ms", PerfCounter.ToMilliseconds(t3, t4)); } }
public void TableValuedPerformanceTest() { var songs = Database.MListQuery((AlbumEntity a) => a.Songs).Select(a => a.Element); var t1 = PerfCounter.Ticks; var fast = (from s1 in songs from s2 in songs from s3 in songs from s4 in songs select MinimumExtensions.MinimumTableValued( MinimumExtensions.MinimumTableValued(s1.Seconds, s2.Seconds).Select(a => a.MinValue).First(), MinimumExtensions.MinimumTableValued(s3.Seconds, s4.Seconds).Select(a => a.MinValue).First() ).Select(a => a.MinValue).First()).ToList(); var t2 = PerfCounter.Ticks; var fast2 = (from s1 in songs from s2 in songs from s3 in songs from s4 in songs let x = MinimumExtensions.MinimumTableValued(s1.Seconds, s2.Seconds).Select(a => a.MinValue).First() let y = MinimumExtensions.MinimumTableValued(s3.Seconds, s4.Seconds).Select(a => a.MinValue).First() select MinimumExtensions.MinimumTableValued(x, y).Select(a => a.MinValue).First()).ToList(); var t3 = PerfCounter.Ticks; var slow = (from s1 in songs from s2 in songs from s3 in songs from s4 in songs let x = MinimumExtensions.MinimumScalar(s1.Seconds, s2.Seconds) let y = MinimumExtensions.MinimumScalar(s3.Seconds, s4.Seconds) select MinimumExtensions.MinimumScalar(x, y)).ToList(); var t4 = PerfCounter.Ticks; Assert.IsTrue(PerfCounter.ToMilliseconds(t1, t2) < PerfCounter.ToMilliseconds(t3, t4)); Assert.IsTrue(PerfCounter.ToMilliseconds(t2, t3) < PerfCounter.ToMilliseconds(t3, t4)); }
public void SimplifyMinimumTableValued() { var result = (from b in Database.Query <BandEntity>() let min = MinimumExtensions.MinimumTableValued((int)b.Id, (int)b.Id).FirstOrDefault().MinValue select b.Name).ToList(); }
public void TableValuedFunction() { var list = Database.Query <AlbumEntity>() .Where(a => MinimumExtensions.MinimumTableValued((int)a.Id * 2, (int)a.Id).Select(m => m.MinValue).First() > 2).Select(a => a.Id).ToList(); }
public static void Start(SchemaBuilder sb) { if (sb.NotDefined(MethodInfo.GetCurrentMethod())) { sb.Include <AlbumEntity>() .WithExpressionFrom((IAuthorEntity au) => au.Albums()) .WithQuery(() => a => new { Entity = a, a.Id, a.Name, a.Author, a.Label, a.Year }); AlbumGraph.Register(); sb.Include <NoteWithDateEntity>() .WithSave(NoteWithDateOperation.Save) .WithQuery(() => a => new { Entity = a, a.Id, a.Text, a.Target, a.CreationTime, }); sb.Include <ConfigEntity>() .WithSave(ConfigOperation.Save); MinimumExtensions.IncludeFunction(sb.Schema.Assets); sb.Include <ArtistEntity>() .WithSave(ArtistOperation.Save) .WithVirtualMList(a => a.Nominations, n => (Lite <ArtistEntity>)n.Author) .WithQuery(() => a => new { Entity = a, a.Id, a.Name, a.IsMale, a.Sex, a.Dead, a.LastAward, }); new Graph <ArtistEntity> .Execute(ArtistOperation.AssignPersonalAward) { CanExecute = a => a.LastAward != null ? "Artist already has an award" : null, Execute = (a, para) => a.LastAward = new PersonalAwardEntity() { Category = "Best Artist", Year = DateTime.Now.Year, Result = AwardResult.Won }.Execute(AwardOperation.Save) } .Register(); sb.Include <BandEntity>() .WithQuery(() => a => new { Entity = a, a.Id, a.Name, a.LastAward, }); new Graph <BandEntity> .Execute(BandOperation.Save) { CanBeNew = true, CanBeModified = true, Execute = (b, _) => { using (OperationLogic.AllowSave <ArtistEntity>()) { b.Save(); } } } .Register(); sb.Include <LabelEntity>() .WithSave(LabelOperation.Save) .WithQuery(() => a => new { Entity = a, a.Id, a.Name, }); sb.Include <FolderEntity>() .WithQuery(() => e => new { Entity = e, e.Id, e.Name }); RegisterAwards(sb); QueryLogic.Queries.Register(typeof(IAuthorEntity), () => DynamicQueryCore.Manual(async(request, description, cancellationToken) => { var one = await(from a in Database.Query <ArtistEntity>() select new { Entity = (IAuthorEntity)a, a.Id, Type = "Artist", a.Name, Lonely = a.Lonely(), a.LastAward }) .ToDQueryable(description) .AllQueryOperationsAsync(request, cancellationToken); var two = await(from a in Database.Query <BandEntity>() select new { Entity = (IAuthorEntity)a, a.Id, Type = "Band", a.Name, Lonely = a.Lonely(), a.LastAward }) .ToDQueryable(description) .AllQueryOperationsAsync(request, cancellationToken); return(one.Concat(two).OrderBy(request.Orders).TryPaginate(request.Pagination)); }) .Column(a => a.LastAward, cl => cl.Implementations = Implementations.ByAll) .ColumnProperyRoutes(a => a.Id, PropertyRoute.Construct((ArtistEntity a) => a.Id), PropertyRoute.Construct((BandEntity a) => a.Id)), entityImplementations: Implementations.By(typeof(ArtistEntity), typeof(BandEntity))); Validator.PropertyValidator((NoteWithDateEntity n) => n.Text) .IsApplicableValidator <NotNullValidatorAttribute>(n => Corruption.Strict); } }