Skip to content

Commit f94c356

Browse files
Add "ToList" better deferred execution, and obsolete Execute. ALso introduced AsEnumerableAsync and more
1 parent 7a8b86c commit f94c356

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

Magic.IndexedDb/IndexDbManager.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ private Expression<Func<T, bool>> PreprocessPredicate<T>(Expression<Func<T, bool
229229
return Expression.Lambda<Func<T, bool>>(newExpression, predicate.Parameters);
230230
}
231231

232-
internal async Task<IList<T>?> WhereV2Async<T>(
232+
internal async Task<IEnumerable<T>?> WhereV2Async<T>(
233233
string storeName, List<string> jsonQuery, MagicQuery<T> query,
234234
CancellationToken cancellationToken) where T : class
235235
{
@@ -247,7 +247,7 @@ private Expression<Func<T, bool>> PreprocessPredicate<T>(Expression<Func<T, bool
247247
new TypedArgument<bool?>(query?.ResultsUnique!),
248248
};
249249

250-
return await CallJsAsync<IList<T>>
250+
return await CallJsAsync<IEnumerable<T>>
251251
(IndexedDbFunctions.WHERE, cancellationToken,
252252
args);
253253
}
@@ -572,5 +572,18 @@ internal async Task<T> CallJsAsync<T>(string functionName, CancellationToken tok
572572

573573
return await magicJsInvoke.MagicStreamJsAsync<T>(functionName, token, args) ?? default;
574574
}
575+
576+
577+
// Synchronous alternatives
578+
internal void CallJs(string functionName, CancellationToken token, params ITypedArgument[] args)
579+
{
580+
CallJsAsync(functionName, token, args).GetAwaiter().GetResult();
581+
}
582+
583+
internal T CallJs<T>(string functionName, CancellationToken token, params ITypedArgument[] args)
584+
{
585+
return CallJsAsync<T>(functionName, token, args).GetAwaiter().GetResult();
586+
}
587+
575588
}
576589
}

Magic.IndexedDb/Models/MagicQuery.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66
using System.Linq.Expressions;
77
using System.Reflection;
8+
using System.Runtime.CompilerServices;
89
using System.Text;
910
using System.Threading.Tasks;
1011

@@ -92,11 +93,55 @@ private MagicQuery<T> Last()
9293
return this;
9394
}
9495

96+
[Obsolete("Please use 'ToListAsync' or 'AsAsyncEnumerable' or 'ToList' or 'AsEnumerable'")]
9597
public async Task<IEnumerable<T>> Execute()
9698
{
9799
return await Manager.WhereV2Async<T>(SchemaName, JsonQueries, this, default) ?? Enumerable.Empty<T>();
98100
}
99101

102+
//.GetAwaiter().GetResult()
103+
104+
/// <summary>
105+
/// safe to use, but emulates an IAsync until future implementation
106+
/// </summary>
107+
/// <param name="cancellationToken"></param>
108+
/// <returns></returns>
109+
public async IAsyncEnumerable<T> AsAsyncEnumerable([EnumeratorCancellation] CancellationToken cancellationToken = default)
110+
{
111+
var results = await Manager.WhereV2Async<T>(SchemaName, JsonQueries, this, cancellationToken);
112+
113+
if (results != null)
114+
{
115+
foreach (var item in results)
116+
{
117+
yield return item; // ✅ Stream results one at a time
118+
}
119+
}
120+
}
121+
122+
123+
public async Task<List<T>> ToListAsync()
124+
{
125+
return (await Manager.WhereV2Async<T>(SchemaName, JsonQueries, this, default))?.ToList() ?? new List<T>();
126+
}
127+
128+
public IEnumerable<T> AsEnumerable()
129+
{
130+
return Manager.WhereV2Async<T>(SchemaName, JsonQueries, this, default)
131+
.GetAwaiter()
132+
.GetResult()
133+
?? Enumerable.Empty<T>();
134+
}
135+
136+
public List<T> ToList()
137+
{
138+
return Manager.WhereV2Async<T>(SchemaName, JsonQueries, this, default)
139+
.GetAwaiter()
140+
.GetResult()
141+
?.ToList()
142+
?? new List<T>();
143+
}
144+
100145
public async Task<int> Count()
101146
{
102147
var result = await Manager.WhereV2Async<T>(SchemaName, JsonQueries, this, default);

TestWasm/Pages/Home.razor

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<span style="color: #2A56C6;">await</span> manager.<span style="color: #2A56C6;">Where</span><span style="color: #A31515;">&lt;Person&gt;</span>(x =&gt; x.Name.<span style="color: #2A56C6;">StartsWith</span>(<span style="color: #A31515;">"c"</span>, <span style="color: #2A56C6;">StringComparison</span>.<span style="color: #2A56C6;">OrdinalIgnoreCase</span>)
8383
<span style="color: #2A56C6;">||</span> x.Name.<span style="color: #2A56C6;">StartsWith</span>(<span style="color: #A31515;">"l"</span>, <span style="color: #2A56C6;">StringComparison</span>.<span style="color: #2A56C6;">OrdinalIgnoreCase</span>)
8484
<span style="color: #2A56C6;">||</span> x.Name.<span style="color: #2A56C6;">StartsWith</span>(<span style="color: #A31515;">"j"</span>, <span style="color: #2A56C6;">StringComparison</span>.<span style="color: #2A56C6;">OrdinalIgnoreCase</span>) <span style="color: #2A56C6;">&amp;&amp;</span> x._Age <span style="color: #2A56C6;">&gt;</span> <span style="color: #2A56C6;">35</span>
85-
).<span style="color: #2A56C6;">OrderBy</span>(x =&gt; x._Id).<span style="color: #2A56C6;">Skip</span>(<span style="color: #2A56C6;">1</span>).<span style="color: #2A56C6;">Execute</span>();
85+
).<span style="color: #2A56C6;">OrderBy</span>(x =&gt; x._Id).<span style="color: #2A56C6;">Skip</span>(<span style="color: #2A56C6;">1</span>).<span style="color: #2A56C6;">ToListAsync</span>();
8686
</code>
8787
</pre>
8888

@@ -117,7 +117,7 @@
117117
new Person { Name = "Cathy", TestInt = 9, _Age = 22, GUIY = Guid.NewGuid(), DoNotMapTest = "I got away with reading Bobs diary.", Access = Person.Permissions.CanRead | Person.Permissions.CanWrite},
118118
new Person { Name = "Bob", TestInt = 3 , _Age = 69, GUIY = Guid.NewGuid(), DoNotMapTest = "I caught Cathy reading my diary, but I'm too shy to confront her.", Access = Person.Permissions.CanRead },
119119
new Person { Name = "Alex", TestInt = 3 , _Age = 80, GUIY = Guid.NewGuid(), DoNotMapTest = "I'm naked! But nobody can know!" }
120-
};
120+
};
121121
await manager.AddRangeAsync(persons);
122122
}
123123

@@ -131,7 +131,9 @@
131131
|| x.Name.StartsWith("l", StringComparison.OrdinalIgnoreCase)
132132
|| x.Name.StartsWith("j", StringComparison.OrdinalIgnoreCase) && x._Age > 35
133133
|| x.Name.Contains("bo", StringComparison.OrdinalIgnoreCase)
134-
).OrderBy(x => x._Id).Skip(1).Execute();
134+
).OrderBy(x => x._Id).Skip(1).ToListAsync();
135+
136+
135137

136138
/*
137139
* Still working on allowing nested

0 commit comments

Comments
 (0)