ASP.NET-如何与实体框架进行内部连接
我将ASP.NET MVC与实体框架结合使用,并使用SqlQuery获取数据,如下所示: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(
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!
}