代码之家  ›  专栏  ›  技术社区  ›  user979331

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

  •  0
  • user979331  · 技术社区  · 6 年前

    我正在使用带有实体框架的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();
    

    我真的不知道下一步该怎么做,怎么做。加入工作,有人能指点我正确的方向吗?

    谢谢,

    2 回复  |  直到 6 年前
        1
  •  0
  •   Valuator    6 年前

    不知道你的模式,我无法给出具体的答案,但是 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
    

    可以用 连接() 像:

    var result = outers.Where(o => o.SomeValue < 5)
                     .Join(inners, o => o.SomeId, i => i.SomeId, (o, i) => i);
    
        2
  •  0
  •   Steve Py    6 年前

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

    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容器管理并作为依赖项提供。