簡體   English   中英

ASP.NET-如何使用實體框架進行內部聯接

[英]ASP.NET - How to do an inner join with entity framework

我將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的INNER JOIN,我已經閱讀了Join的書,但我確實很難理解。

我定義了我的類別:

private Categories dbCategories = new Categories();

對於下一步的工作以及.join的工作方式,我真的一無所知,有人可以向我指出正確的方向嗎?

謝謝,

在不知道您的架構的情況下,我無法給出具體答案,但是要使用Join() ,您需要提供:

. IEnumerable<TInner> inner這是您要加入

. Expression<Func<TOuter, TKey>> outerKeySelector -這是如何指定從不管你是參加現場。

Expression<Func<TInner, TKey>> innerKeySelector這是您指定要連接的字段的方式- TInner定義的TInner

Expression<Func<TOuter, TInner, TResult>> resultSelector這是您將從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);

實體框架使用配置來反映相關實體之間的關系。 給定的實體如:

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容器管理並作為依賴項提供。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM