-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGetAsync-and-Get.html
389 lines (338 loc) · 24.1 KB
/
GetAsync-and-Get.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
<!DOCTYPE HTML>
<html lang="en" class="light" dir="ltr">
<head>
<!-- Book generated using mdBook -->
<meta charset="UTF-8">
<title>GetAsync & Get - Buzruk.GenericRepository</title>
<!-- Custom HTML head -->
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#ffffff">
<link rel="icon" href="favicon.svg">
<link rel="shortcut icon" href="favicon.png">
<link rel="stylesheet" href="css/variables.css">
<link rel="stylesheet" href="css/general.css">
<link rel="stylesheet" href="css/chrome.css">
<link rel="stylesheet" href="css/print.css" media="print">
<!-- Fonts -->
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
<link rel="stylesheet" href="fonts/fonts.css">
<!-- Highlight.js Stylesheets -->
<link rel="stylesheet" href="highlight.css">
<link rel="stylesheet" href="tomorrow-night.css">
<link rel="stylesheet" href="ayu-highlight.css">
<!-- Custom theme stylesheets -->
</head>
<body class="sidebar-visible no-js">
<div id="body-container">
<!-- Provide site root to javascript -->
<script>
var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
</script>
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }
</script>
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('light')
html.classList.add(theme);
var body = document.querySelector('body');
body.classList.remove('no-js')
body.classList.add('js');
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
<!-- Hide / unhide sidebar before it is displayed -->
<script>
var body = document.querySelector('body');
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
}
sidebar_toggle.checked = sidebar === 'visible';
body.classList.remove('sidebar-visible');
body.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter"><li class="chapter-item expanded "><a href="Home.html"><strong aria-hidden="true">1.</strong> Welcome Aboard!</a></li><li class="chapter-item expanded "><a href="Installation.html"><strong aria-hidden="true">2.</strong> Installation Blastoff!</a></li><li class="chapter-item expanded affix "><li class="part-title">⚡️ Core Functionalities</li><li class="chapter-item expanded "><a href="Usage-examples.html"><strong aria-hidden="true">3.</strong> Code Examples Galore!</a></li><li class="chapter-item expanded "><div><strong aria-hidden="true">4.</strong> CRUD</div></li><li><ol class="section"><li class="chapter-item expanded "><a href="GetAsync-and-Get.html" class="active"><strong aria-hidden="true">4.1.</strong> GetAsync & Get</a></li><li class="chapter-item expanded "><a href="GetPagedAsync-and-GetPaged.html"><strong aria-hidden="true">4.2.</strong> GetPagedAsync & GetPaged</a></li><li class="chapter-item expanded "><a href="AddAsync-and-Add.html"><strong aria-hidden="true">4.3.</strong> AddAsync & Add</a></li><li class="chapter-item expanded "><a href="AddRangeAsync-and-AddRange.html"><strong aria-hidden="true">4.4.</strong> AddRangeAsync & AddRange</a></li><li class="chapter-item expanded "><a href="UpdateAsync-and-Update.html"><strong aria-hidden="true">4.5.</strong> UpdateAsync & Update</a></li><li class="chapter-item expanded "><a href="updateRangeAsync-and-UpdateRange.html"><strong aria-hidden="true">4.6.</strong> UpdateRangeAsync & UpdateRange</a></li><li class="chapter-item expanded "><a href="RemoveAsync-and-Remove.html"><strong aria-hidden="true">4.7.</strong> RemoveAsync & Remove</a></li><li class="chapter-item expanded "><a href="RemoveRangeAsync-and-RemoveRange.html"><strong aria-hidden="true">4.8.</strong> RemoveRangeAsync & RemoveRange</a></li></ol></li><li class="chapter-item expanded "><div><strong aria-hidden="true">5.</strong> Other Methods</div></li><li><ol class="section"><li class="chapter-item expanded "><a href="ExistsAsync-and-Exists.html"><strong aria-hidden="true">5.1.</strong> ExistsAsync & Exists</a></li><li class="chapter-item expanded "><a href="CountAsync-and-Count.html"><strong aria-hidden="true">5.2.</strong> CountAsync & Count</a></li><li class="chapter-item expanded "><a href="LongCountAsync-and-LongCount.html"><strong aria-hidden="true">5.3.</strong> LongCountAsync & LongCount</a></li><li class="chapter-item expanded "><a href="CountByAsync-and-CountBy.html"><strong aria-hidden="true">5.4.</strong> CountByAsync & CountBy</a></li><li class="chapter-item expanded "><a href="saveChangesAsync-and-SaveChanges.html"><strong aria-hidden="true">5.5.</strong> SaveChangesAsync & SaveChanges</a></li></ol></li><li class="chapter-item expanded "><li class="part-title">Support & Community</li><li class="chapter-item expanded "><a href="Faq.html"><strong aria-hidden="true">6.</strong> FAQ: Your Questions Answered</a></li><li class="chapter-item expanded "><a href="Troubleshooting.html"><strong aria-hidden="true">7.</strong> Troubleshooting Like a Pro</a></li><li class="chapter-item expanded "><a href="CONTRIBUTING.html"><strong aria-hidden="true">8.</strong> Contribute & Make an Impact!</a></li><li class="chapter-item expanded affix "><li class="part-title">Additional Resources</li><li class="chapter-item expanded "><a href="CHANGELOG.html"><strong aria-hidden="true">9.</strong> CHANGELOG.md: Stay Updated</a></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</div>
</nav>
<!-- Track and set sidebar scroll position -->
<script>
var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
sidebarScrollbox.addEventListener('click', function(e) {
if (e.target.tagName === 'A') {
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
}
}, { passive: true });
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
sessionStorage.removeItem('sidebar-scroll');
if (sidebarScrollTop) {
// preserve sidebar scroll position when navigating via links within sidebar
sidebarScrollbox.scrollTop = sidebarScrollTop;
} else {
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
var activeSection = document.querySelector('#sidebar .active');
if (activeSection) {
activeSection.scrollIntoView({ block: 'center' });
}
}
</script>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
<i class="fa fa-bars"></i>
</label>
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
<i class="fa fa-paint-brush"></i>
</button>
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
</ul>
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
<i class="fa fa-search"></i>
</button>
</div>
<h1 class="menu-title">Buzruk.GenericRepository</h1>
<div class="right-buttons">
<a href="print.html" title="Print this book" aria-label="Print this book">
<i id="print-button" class="fa fa-print"></i>
</a>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults">
</ul>
</div>
</div>
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
<script>
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});
</script>
<div id="content" class="content">
<main>
<h1 id="getasync--get-power-up-your-data-retrieval-in-buzrukgenericrepository"><a class="header" href="#getasync--get-power-up-your-data-retrieval-in-buzrukgenericrepository">GetAsync & Get: Power Up Your Data Retrieval in Buzruk.GenericRepository</a></h1>
<p>This section dives deep into the <code>GetAsync</code> and <code>Get</code> methods, your weapons of choice for retrieving entities in Buzruk.GenericRepository. We'll explore their functionalities, usage scenarios, comparisons, and best practices to empower you with efficient data access.</p>
<p>This comprehensive guide empowers you to master the GetAsync and Get methods within Buzruk.GenericRepository. We'll delve into their functionalities, explore various usage scenarios with different parameters, and provide examples to illustrate their power.</p>
<h2 id="unveiling-the-power-of-getasync-asynchronous"><a class="header" href="#unveiling-the-power-of-getasync-asynchronous">Unveiling the Power of <code>GetAsync</code> (Asynchronous):</a></h2>
<ul>
<li><strong>Champion of Responsiveness</strong>: <code>GetAsync</code> shines in asynchronous operations. It retrieves an entity by its ID without blocking the UI thread, keeping your applications responsive and snappy. This is particularly valuable for user interfaces where you want to avoid freezing while data is fetched.</li>
</ul>
<h3 id="example-asynchronously-retrieving-a-product"><a class="header" href="#example-asynchronously-retrieving-a-product">Example: Asynchronously Retrieving a Product</a></h3>
<pre><code class="language-csharp">// Assuming you have an instance of the repository (`repository`)
// and a product ID (`123`)
Task<Product> productTask = repository.GetAsync<Product>(123);
// Use await to get the actual product object
Product product = await productTask;
if (product != null)
{
Console.WriteLine($"Product Name: {product.Name}");
}
else
{
Console.WriteLine("Product not found.");
}
</code></pre>
<h3 id="getasync-in-action"><a class="header" href="#getasync-in-action"><code>GetAsync</code> in Action:</a></h3>
<ul>
<li>Ideal for scenarios where immediate data access isn't crucial, but maintaining a responsive UI is essential.</li>
<li>Applications with user interactions that could be interrupted by synchronous data retrieval benefit greatly from <code>GetAsync</code>.</li>
</ul>
<h2 id="understanding-get-synchronous"><a class="header" href="#understanding-get-synchronous">Understanding <code>Get</code> (Synchronous):</a></h2>
<ul>
<li><strong>Speedy Retrieval</strong>: <code>Get</code> excels in synchronous data retrieval. It fetches an entity by its ID in a single operation, making it a good choice when you need the data immediately and UI responsiveness isn't a major concern.</li>
</ul>
<h3 id="example-synchronously-retrieving-a-product"><a class="header" href="#example-synchronously-retrieving-a-product">Example: Synchronously Retrieving a Product</a></h3>
<pre><code class="language-csharp">// Assuming you have an instance of the repository (`repository`)
// and a product ID (`123`)
Product product = repository.Get<Product>(123);
if (product != null)
{
Console.WriteLine($"Product Name: {product.Name}");
}
else
{
Console.WriteLine("Product not found.");
}
</code></pre>
<h3 id="get-on-the-battlefield"><a class="header" href="#get-on-the-battlefield"><code>Get</code> on the Battlefield</a></h3>
<ul>
<li>Perfect for background tasks or processes where responsiveness isn't a priority.</li>
<li>If you need the data immediately for further processing or decision-making within the same code block, <code>Get</code> might be a suitable choice.</li>
</ul>
<h2 id="choosing-your-champion-getasync-vs-get"><a class="header" href="#choosing-your-champion-getasync-vs-get">Choosing Your Champion: <code>GetAsync</code> vs. <code>Get</code></a></h2>
<p>Here's a quick comparison to help you decide:</p>
<div class="table-wrapper"><table><thead><tr><th>Feature</th><th>GetAsync</th><th>Get</th></tr></thead><tbody>
<tr><td>Execution</td><td>Asynchronous</td><td>Synchronous</td></tr>
<tr><td>UI Responsiveness</td><td>Maintains responsiveness</td><td>Might block the UI thread</td></tr>
<tr><td>Use Cases</td><td>User interactions, background processes</td><td>Background tasks, immediate data processing</td></tr>
<tr><td>Performance (Network)</td><td>Potentially better for high latency networks</td><td>Might be slightly faster on local networks</td></tr>
</tbody></table>
</div>
<h2 id="pro-tips-for-effective-usage"><a class="header" href="#pro-tips-for-effective-usage">Pro Tips for Effective Usage</a></h2>
<ul>
<li><strong>Embrace Asynchronous Operations</strong>: In most modern applications, <code>GetAsync</code> is the recommended approach due to its responsiveness benefits.</li>
<li><strong>Consider UI Impact</strong>: If user interaction might be affected by a data retrieval block, prioritize <code>GetAsync</code>.</li>
<li><strong>Network Latency Matters</strong>: In high-latency network environments, <code>GetAsync</code> can outperform <code>Get</code> due to its non-blocking nature.</li>
<li><strong>Error Handling</strong>: Implement proper error handling mechanisms to gracefully handle cases where the entity might not be found.</li>
</ul>
<p><strong>Remember</strong>: Both GetAsync and Get offer valuable functionalities for retrieving entities. By understanding their strengths, weaknesses, and use cases, you can make informed decisions to optimize your data access strategy in Buzruk.GenericRepository.</p>
<h2 id="understanding-getasync-asynchronous-and-get-synchronous"><a class="header" href="#understanding-getasync-asynchronous-and-get-synchronous">Understanding <code>GetAsync</code> (Asynchronous) and <code>Get</code> (Synchronous)</a></h2>
<ul>
<li><strong>Core Functionality</strong>: Both methods serve the same purpose: retrieving an entity by its ID.
<ul>
<li><code>GetAsync</code> operates asynchronously, excelling in responsiveness for UI-centric applications.</li>
<li><code>Get</code> works synchronously, fetching data in a single operation, making it suitable for background tasks.</li>
</ul>
</li>
</ul>
<h3 id="exploring-the-powerhouse-parameters"><a class="header" href="#exploring-the-powerhouse-parameters">Exploring the Powerhouse Parameters</a></h3>
<p>Both methods offer a plethora of optional parameters that significantly enhance data retrieval capabilities. Here's a breakdown of the key ones:</p>
<ol>
<li>Predicates (Expression<Func<T, bool>>):
<ul>
<li><strong>Function</strong>: Filter entities based on specific criteria.</li>
<li><strong>Usage</strong>: Pass a lambda expression that evaluates to <code>true</code> for entities you want to retrieve.</li>
</ul>
</li>
</ol>
<p><strong>Example: Get Products with Price Greater Than $100 (Async):</strong></p>
<pre><code class="language-csharp">Task<Product> productTask = repository.GetAsync<Product>(
predicate: p => p.Price > 100
);
// Await the task to get the product
Product product = await productTask;
</code></pre>
<ol start="2">
<li><code>orderBy</code> (Expression<Func<T, object>>) and <code>thenBy</code> (Expression<Func<T, object>>):
<ul>
<li><strong>Function</strong>: Order retrieved entities based on one or more properties.</li>
<li><strong>Usage</strong>: Pass a lambda expression specifying the property for sorting (ascending order by default). Use <code>thenBy</code> for chained sorting (optional).</li>
</ul>
</li>
</ol>
<p><strong>Example: Get Top 3 Products Ordered by Price (Descending) with <code>thenBy</code> for Name (Async):</strong></p>
<pre><code class="language-csharp">Task<List<Product>> productsTask = repository.GetAsync<Product>(
orderBy: p => p.Price descending,
thenBy: p => p.Name
).Take(3); // Limit to top 3 products
List<Product> products = await productsTask;
foreach (var product in products)
{
Console.WriteLine($"Product: {product.Name}, Price: ${product.Price}");
}
</code></pre>
<ol start="3">
<li><code>includes</code> (Expression<Func<T, object>>[]) and <code>thenInclude</code> (Expression<Func<T, object>>[]):
<ul>
<li><strong>Function</strong>: Eagerly load related entities along with the primary entity.</li>
<li><strong>Usage</strong>: Pass an array of lambda expressions specifying the navigation properties to include. Use <code>thenInclude</code> for nested eager loading (optional).</li>
</ul>
</li>
</ol>
<p><strong>Example: Get Product with its Category (Async):</strong></p>
<pre><code class="language-csharp">Task<Product> productTask = repository.GetAsync<Product>(
includes: p => p.Category
);
Product product = await productTask;
if (product != null)
{
Console.WriteLine($"Product Name: {product.Name}");
Console.WriteLine($"Category Name: {product.Category.Name}");
}
</code></pre>
<ol start="4">
<li><code>tracking</code> (bool):
<ul>
<li><strong>Function</strong>: Controls whether to track entity changes for potential updates (optional, might require repository configuration for <code>UpdateAsync</code> to work).</li>
<li><strong>Usage</strong>: Set to <code>true</code> to enable change tracking.</li>
</ul>
</li>
</ol>
<p><strong>Important Note</strong>: Refer to your repository's specific documentation for any additional parameters or configuration requirements related to change tracking.</p>
<h3 id="behavior-without-parameters"><a class="header" href="#behavior-without-parameters">Behavior Without Parameters</a></h3>
<ul>
<li>If no parameters are provided, both <code>GetAsync</code> and <code>Get</code> retrieve the entity by its ID only.</li>
<li>The returned value is a <code>Product</code> object (or your specific entity type) if the entity is found, or <code>null</code> if not found.</li>
</ul>
<h3 id="remember"><a class="header" href="#remember">Remember</a></h3>
<ul>
<li>Prioritize <code>GetAsync</code> for responsive UI-centric applications.</li>
<li>Choose Get for background tasks or scenarios where immediate data access is critical.</li>
<li>Leverage predicates for filtering, <code>orderBy</code>/<code>thenBy</code> for sorting, <code>includes</code>/<code>thenInclude</code> for eager loading, and <code>tracking</code> (if supported) for efficient updates.</li>
<li>Always refer to your repository's documentation for complete parameter details and configuration requirements.</li>
</ul>
<p>By mastering these advanced functionalities, you can unlock the full potential of <code>GetAsync</code> and <code>Get</code>, enabling you to retrieve and manipulate data with precision and efficiency within Buzruk.GenericRepository.</p>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
<a rel="prev" href="Usage-examples.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="GetPagedAsync-and-GetPaged.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a rel="prev" href="Usage-examples.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
<a rel="next prefetch" href="GetPagedAsync-and-GetPaged.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
</div>
<script>
window.playground_copyable = true;
</script>
<script src="elasticlunr.min.js"></script>
<script src="mark.min.js"></script>
<script src="searcher.js"></script>
<script src="clipboard.min.js"></script>
<script src="highlight.js"></script>
<script src="book.js"></script>
<!-- Custom JS scripts -->
</div>
</body>
</html>