Calibre_EntityFrameworkCore

1) Добавление связи между книгами и тегами 2) В выборке сделана

10/9/2021 10:13:07 PM

Details

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}";
+        }
     }
 }
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}";
+        }
     }
 }
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}");
+            }
         }
     }
 }