Calibre_EntityFrameworkCore

Changes

src/Calibre/Program.cs 115(+109 -6)

Details

diff --git a/src/Calibre/Calibre.csproj b/src/Calibre/Calibre.csproj
index 44268a9..d42fee7 100644
--- a/src/Calibre/Calibre.csproj
+++ b/src/Calibre/Calibre.csproj
@@ -6,6 +6,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" />
     <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.10">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

src/Calibre/Program.cs 115(+109 -6)

diff --git a/src/Calibre/Program.cs b/src/Calibre/Program.cs
index 26fefee..ac8043d 100644
--- a/src/Calibre/Program.cs
+++ b/src/Calibre/Program.cs
@@ -1,22 +1,125 @@
 using System;
+
+using System.Collections.Generic;
+using System.Threading.Tasks;
 using System.Linq;
+using System.IO;
+using System.Diagnostics;
+
+using Microsoft.EntityFrameworkCore;
 
 using Calibre.Model.Database;
+using Calibre.Model.Database.Entities;
 
 namespace Calibre
 {
     class Program
     {
-        static void Main(string[] args)
+        private static string[] SelectDbFiles(DirectoryInfo directory)
+        {
+            var dbFiles = directory
+                .GetFiles("metadata.db", SearchOption.AllDirectories)
+                .Select(e => e.FullName)
+                .ToArray();
+
+            return dbFiles;
+        }
+
+        private static string BuildConnectionStringFromPath(string path)
+        {
+            return $"Filename={path}";
+        }
+
+        private static async Task<Dictionary<string, Book[]>> SearchBooksByTitle(
+            string[] connectionStrings,
+            string containsTitle
+            )
         {
-            var connectionString = @"";
+            List<CalibreContext> contexts 
+                = new List<CalibreContext>(connectionStrings.Length);
+            Dictionary<string, Task<Book[]>> data 
+                = new Dictionary<string, Task<Book[]>>(connectionStrings.Length);
+
+            try
+            {
+                foreach (var elem in connectionStrings)
+                {
+                    var context = new CalibreContext(elem);
+                    contexts.Add(context);
 
-            using (var context = new CalibreContext(connectionString))
+                    var selectResultTask = context
+                        .Books
+                        .Where(
+                            e => e.Title.Contains(containsTitle)
+                            )
+                        .ToArrayAsync();
+
+                    data.Add(elem, selectResultTask);
+                }
+
+                await Task.WhenAll(
+                    data.Values.ToArray()
+                    );
+            }
+            finally 
             {
-                var books = context.Books
-                    .OrderBy(e => e.Id)
-                    .ToArray();
+                contexts.ForEach(
+                    e => e.Dispose()
+                    );
             }
+
+            var result = data
+                .ToDictionary(
+                    e => e.Key, 
+                    e => e.Value.Result
+                    );
+            return result;
+        }
+
+
+        static void Main(string[] args)
+        {
+            //var connectionString = @"";
+
+            //using (var context = new CalibreContext(connectionString))
+            //{
+            //    var books = context.Books
+            //        .OrderBy(e => e.Id)
+            //        .ToArray();
+            //}
+
+
+            SearchByTitleInDirectory(
+                new DirectoryInfo(@"S:\BooksText\Calibre"),
+                ""
+                )
+                .GetAwaiter()
+                .GetResult();
+        }
+
+
+        static async Task SearchByTitleInDirectory(
+            DirectoryInfo directory, 
+            string containsTitle
+            )
+        {
+            var watch = Stopwatch.StartNew();
+
+            var dbFiles = SelectDbFiles(directory);
+            var connectionStrings = dbFiles
+                .Select(
+                    e => BuildConnectionStringFromPath(e)
+                )
+                .ToArray();
+
+            var searchResult = await SearchBooksByTitle(connectionStrings, containsTitle)
+                .ConfigureAwait(false);
+            watch.Stop();
+
+
+            var allBooks = searchResult
+                .SelectMany(e => e.Value)
+                .ToArray();
         }
     }
 }