Calibre_EntityFrameworkCore
Details
src/Calibre/Calibre.csproj 1(+1 -0)
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();
}
}
}