ASP.NET - как сделать внутреннее соединение с сущностью - PullRequest
0 голосов
/ 24 мая 2018

Я использую ASP.NET MVC с Entity Framework и получаю свои данные с помощью SqlQuery следующим образом:

dbBlog.Data.SqlQuery("SELECT bc.id, bc.title, bc.post, bc.date, bc.featuredImage, cc.category FROM BlogClasses bc INNER JOIN CategoriesClasses cc ON bc.category = cc.id WHERE cc.category = '" + id.Replace("_", " ") + "' ORDER BY bc.date desc").ToList();

То, что я пытаюсь сделать сейчас, и это ВНУТРЕННЕЕ СОЕДИНЕНИЕ без использования SqlQuery, у меня естьЯ прочитал несколько слов о Join, и я действительно изо всех сил пытаюсь понять это.

У меня есть определенные категории:

private Categories dbCategories = new Categories();

Я действительно понятия не имею, на каком следующем шаге это будет и как .joinработает, может кто-нибудь направить меня в правильном направлении?

Спасибо,

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Entity Framework использует конфигурации для отражения отношений между связанными объектами.Для таких объектов, как:

public class BlogClass
{
   public int Id {get; set;}
   public string Title {get; set;}
   public string Post {get; set;}
   public DateTime Date {get; set;}
   public string FeaturedImage {get; set;} // Assuming a URL?

   public virtual ClassCategory Category {get;set;}
}

public class ClassCategory
{
   public int Id {get; set;}
   public string Category {get; set;}
   // Other properties...
}

Мы можем настроить наши конфигурации:

public class BlogClassConfiguration : EntityTypeConfiguration<BlogClass>
{
   public BlogClassConfiguration()
   {
      ToTable("BlogClasses");
      HasKey(x => x.Id)
         .Property(x => x.Id)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // Assuming the ID's are set up as identity or have defaults.

      HasRequired(x => x.Category)
         .WithMany()
         .Map(x => x.MapKey("Category")); // This maps our CategoryClasses reference (Category) to a column on the BlogCategories table called "Category".
   }
}
Public class ClassCategoryConfiguration : EntityTypeConfiguration<ClassCategory>
{
   public ClassCategoryConfiguration()
   {
      ToTable("CategoryClasses");
      HasKey(x => x.Id)
         .Property(x => x.Id)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
   }
}

Мы сообщаем DbContext загружать эти конфигурации при построении своих моделей:

public class BlogDbContext : DbContext
{
   public DbSet<BlogClass> BlogClasses {get; set;}

   public BlogDbContext(string connectionString)
      : base (connectionString)
   {}

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
      base.OnModelCreating(modelBuilder);

 modelBuilder.Configurations.AddFromAssembly(typeof(TestDbContext).Assembly);
   }
}

Затем EF полностью управляет объединениями.

var categoryName = category.Replace("_", " ");

using (var context = new BlogContext("BlogConnectionString"))
{
   var blogs = context.BlogClasses
      .Where(x => x.Category.Category == categoryName)
      .OrderByDescending(x => x.Date)
      .ToList(); // Assumes not too many items returned!
}

В этом примере в качестве примера используется DbContext.В идеале это должно управляться контейнером IoC и предоставляться как зависимость.

0 голосов
/ 24 мая 2018

Не зная вашей схемы, я не могу дать конкретный ответ, но с Join() вам необходимо предоставить:

IEnumerable<TInner> inner - это то, что вы хотите присоединить к .

Expression<Func<TOuter, TKey>> outerKeySelector - это как указать поле из того, к чему вы присоединяетесь из .

Expression<Func<TInner, TKey>> innerKeySelector - это то, как вы указываете полеприсоединение к - что-то из TInner, определенного ранее.

Expression<Func<TOuter, TInner, TResult>> resultSelector - это то, что вы будете возвращать из объединения.

Пример, этот SQL-запрос:

SELECT i.*
FROM Outer o JOIN Inner i ON o.SomeId = i.SomeId
WHERE o.SomeValue < 5

Может быть написано с Join() как:

var result = outers.Where(o => o.SomeValue < 5)
                 .Join(inners, o => o.SomeId, i => i.SomeId, (o, i) => i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...