ASP.NET-如何与实体框架进行内部连接

ASP.NET-如何与实体框架进行内部连接,asp.net,entity-framework,Asp.net,Entity Framework,我将ASP.NET MVC与实体框架结合使用,并使用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(

我将ASP.NET MVC与实体框架结合使用,并使用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的内部连接,我已经读了一些关于连接的书,我真的很难理解它

我定义了我的类别:

private Categories dbCategories = new Categories();
我真的不知道下一步该怎么做,怎么做。join起作用了,有人能给我指出正确的方向吗


谢谢,

在不了解您的模式的情况下,我无法给出具体的答案,但是使用
Join()
,您需要提供:

IEnumerable-inner
-这是您想要加入的内容

Expression outerKeySelector
-这是如何从您要加入的内容中指定字段

Expression innerKeySelector
-这是指定要加入的字段的方式-来自前面定义的
TInner

表达式结果选择器
-这是您将从联接返回的内容

例如,此SQL查询:

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

实体框架使用配置来反映相关实体之间的关系。给定实体,如:

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为例。理想情况下,这应该由IoC容器管理并作为依赖项提供。

有什么理由不使用导航属性和强类型数据库集?这就是EF的真正力量。很少需要或推荐手工查询和联接。
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);
   }
}
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);
   }
}
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!
}