Calibre_EntityFrameworkCore
Changes
src/Calibre.Model.Database/CalibreContext.cs 10(+10 -0)
src/Calibre.Model.Database/Entities/Tag.cs 21(+21 -0)
src/Calibre/Program.cs 45(+36 -9)
Details
src/Calibre.Model.Database/CalibreContext.cs 10(+10 -0)
diff --git a/src/Calibre.Model.Database/CalibreContext.cs b/src/Calibre.Model.Database/CalibreContext.cs
index 30cbffc..17bdaba 100644
--- a/src/Calibre.Model.Database/CalibreContext.cs
+++ b/src/Calibre.Model.Database/CalibreContext.cs
@@ -486,6 +486,16 @@ namespace Calibre.Model.Database
entity.Property(e => e.Book).HasColumnName("book");
entity.Property(e => e.Tag).HasColumnName("tag");
+
+
+ entity
+ .HasOne(e => e.BookItem)
+ .WithMany(e => e.Tags)
+ .HasForeignKey(e => e.Book);
+ entity
+ .HasOne(e => e.TagItem)
+ .WithMany(e => e.Books)
+ .HasForeignKey(e => e.Tag);
});
modelBuilder.Entity<Comment>(entity =>
diff --git a/src/Calibre.Model.Database/Entities/Book.cs b/src/Calibre.Model.Database/Entities/Book.cs
index c6613b2..3d54a48 100644
--- a/src/Calibre.Model.Database/Entities/Book.cs
+++ b/src/Calibre.Model.Database/Entities/Book.cs
@@ -21,7 +21,8 @@ namespace Calibre.Model.Database.Entities
public string Uuid { get; set; }
public byte[] HasCover { get; set; }
public byte[] LastModified { get; set; }
-
+ public virtual List<BooksTagsLink> Tags { get; set; }
+ = new List<BooksTagsLink>();
public override string ToString()
{
diff --git a/src/Calibre.Model.Database/Entities/BooksTagsLink.cs b/src/Calibre.Model.Database/Entities/BooksTagsLink.cs
index 7ca2060..9b1cf59 100644
--- a/src/Calibre.Model.Database/Entities/BooksTagsLink.cs
+++ b/src/Calibre.Model.Database/Entities/BooksTagsLink.cs
@@ -8,7 +8,17 @@ namespace Calibre.Model.Database.Entities
public partial class BooksTagsLink
{
public long Id { get; set; }
+
public long Book { get; set; }
+ public virtual Book BookItem { get; set; }
+
public long Tag { get; set; }
+ public virtual Tag TagItem { get; set; }
+
+
+ public override string ToString()
+ {
+ return $"{Tag}|{TagItem.Name}|{Book}|{BookItem.Title}";
+ }
}
}
src/Calibre.Model.Database/Entities/Tag.cs 21(+21 -0)
diff --git a/src/Calibre.Model.Database/Entities/Tag.cs b/src/Calibre.Model.Database/Entities/Tag.cs
index 4363e73..82656ea 100644
--- a/src/Calibre.Model.Database/Entities/Tag.cs
+++ b/src/Calibre.Model.Database/Entities/Tag.cs
@@ -9,5 +9,26 @@ namespace Calibre.Model.Database.Entities
{
public long Id { get; set; }
public string Name { get; set; }
+
+ public virtual List<BooksTagsLink> Books { get; set; }
+ = new List<BooksTagsLink>();
+
+
+ public override int GetHashCode()
+ {
+ return Id.GetHashCode();
+ } public override bool Equals(object obj)
+ {
+ if (obj is Tag tag)
+ {
+ return tag.Id == Id;
+ }
+
+ return false;
+ }
+ public override string ToString()
+ {
+ return $"{Id}|{Name}";
+ }
}
}
src/Calibre/Program.cs 45(+36 -9)
diff --git a/src/Calibre/Program.cs b/src/Calibre/Program.cs
index ac8043d..0ba59fc 100644
--- a/src/Calibre/Program.cs
+++ b/src/Calibre/Program.cs
@@ -47,13 +47,20 @@ namespace Calibre
var context = new CalibreContext(elem);
contexts.Add(context);
- var selectResultTask = context
+ IQueryable<Book> selectExpr = context
.Books
- .Where(
- e => e.Title.Contains(containsTitle)
- )
- .ToArrayAsync();
-
+ .Include(e => e.Tags)
+ .ThenInclude(e => e.TagItem);
+
+ if (string.IsNullOrEmpty(containsTitle))
+ {
+ selectExpr = selectExpr
+ .Where(
+ e => e.Title.Contains(containsTitle)
+ );
+ }
+
+ var selectResultTask = selectExpr.ToArrayAsync();
data.Add(elem, selectResultTask);
}
@@ -76,7 +83,6 @@ namespace Calibre
return result;
}
-
static void Main(string[] args)
{
//var connectionString = @"";
@@ -90,7 +96,7 @@ namespace Calibre
SearchByTitleInDirectory(
- new DirectoryInfo(@"S:\BooksText\Calibre"),
+ new DirectoryInfo(@""),
""
)
.GetAwaiter()
@@ -112,7 +118,7 @@ namespace Calibre
)
.ToArray();
- var searchResult = await SearchBooksByTitle(connectionStrings, containsTitle)
+ var searchResult = await SearchBooksByTitle(connectionStrings, "")
.ConfigureAwait(false);
watch.Stop();
@@ -120,6 +126,27 @@ namespace Calibre
var allBooks = searchResult
.SelectMany(e => e.Value)
.ToArray();
+
+ var allTags = allBooks
+ .SelectMany(e => e.Tags)
+ .Select(e => e.TagItem)
+ .Distinct()
+ .ToHashSet();
+
+ var searchIgnoreCase = allBooks
+ .Where(
+ e =>
+ e.Title.Contains(containsTitle, StringComparison.OrdinalIgnoreCase)
+ || e.Tags.Any(
+ e => e.TagItem.Name.Contains(containsTitle, StringComparison.OrdinalIgnoreCase)
+ )
+ )
+ .ToArray();
+
+ foreach (var elem in searchIgnoreCase)
+ {
+ Console.WriteLine($"{elem.Title}|{elem.AuthorSort}");
+ }
}
}
}