![](/img/trans.png)
[英]asp.net entity framework - Complicated Queries with join + Membership user
[英]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.