[英]How to create field and get data from joined table in Entity Framework 6
[英]How to Create Data or Entity Relationship on the same Table and Join another Table on the first Joined Table?
我在使用同一個表構建數據或實體關系並將另一個表連接到第一個內部連接表時遇到問題。
我想以這種方式獲取查詢結果:
SELECT [n].[ISCInstanceId], [n].[NavPointId], [n].[ParentNPId], [n].[DataPointId], [n].[NodeOrder], [n].[RefNumber], [n].[TreeTitle], [n].[IsArchived], [n].[IsInNavbar], [i].[Name]
FROM [NavPoints] AS [n]
INNER JOIN [NavPoints] AS [n0] ON [n].[ParentNPId] = [n0].[NavPointId]
INNER JOIN [ISCInstances] AS [i] ON [n0].[ISCInstanceId] = [i].[ISCInstanceId]
WHERE (([n].[IsArchived] = CAST(0 AS bit)) AND ([n].[IsInNavbar] = CAST(1 AS bit))) AND ([n0].[ISCInstanceId] = @__IscinstanceId_0)
ORDER BY [n].[ParentNPId], [n].[NodeOrder]
但我得到了這個:
SELECT [n].[ISCInstanceId], [n].[NavPointId], [n].[ParentNPId], [n].[DataPointId], [n].[NodeOrder], [n].[RefNumber], [n].[TreeTitle], [n].[IsArchived], [n].[IsInNavbar], [i].[Name]
FROM [NavPoints] AS [n]
INNER JOIN [NavPoints] AS [n0] ON [n].[ParentNPId] = [n0].[NavPointId]
INNER JOIN [ISCInstances] AS [i] ON [n].[ISCInstanceId] = [i].[ISCInstanceId]
WHERE (([n].[IsArchived] = CAST(0 AS bit)) AND ([n].[IsInNavbar] = CAST(1 AS bit))) AND ([n0].[ISCInstanceId] = @__IscinstanceId_0)
ORDER BY [n].[ParentNPId], [n].[NodeOrder]
問題是部分或行INNER JOIN [ISCInstances] AS [i] ON [n].[ISCInstanceId] = [i].[ISCInstanceId]女巫是我得到的查詢沒有加入第一個內部連接表,我希望它像這樣INNER JOIN [ISCInstances] AS [i] ON [n0].[ISCInstanceId] = [i].[ISCInstanceId]
數據庫上下文
modelBuilder.Entity<NavPoint>(entity =>
{
...
entity.HasOne(d => d.Iscinstances)
.WithMany(p => p.NavPoints)
.HasForeignKey(d => d.IscinstanceId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_NavPoints_Iscinstances");
entity.HasOne(d => d.NavPointsParent)
.WithMany(p => p.NavPoints)
.HasForeignKey(d => d.ParentNpid)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_NavPoints_NavPoints");
});
類模型
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Odysseus_API.Models
{
public partial class NavPoint
{
public NavPoint()
{
NavPoints = new HashSet<NavPoint>();
}
[key]
public int NavPointId { get; set; }
public int ParentNpid { get; set; }
...
[ForeignKey("ParentNpid")]
public virtual NavPoint NavPointsParent { get; set; }
public virtual Iscinstance Iscinstances { get; set; }
[ForeignKey("NavPointId")]
public virtual ICollection<NavPoint> NavPoints { get; set; }
}
}
控制器
[HttpGet]
public async Task<ActionResult<NavPoint>> GetNavPoint(int IscinstanceId)
{
if (_context.Users == null)
{
return NotFound();
}
var navpoint = await _context.NavPoints
.Where(c => c.IsArchived == false && c.IsInNavbar == true && c.NavPointsParent.IscinstanceId == IscinstanceId)
.Include(c => c.NavPointsParent).Include(c => c.Iscinstances)
.OrderBy(c => c.ParentNpid).ThenBy(c => c.NodeOrder)
.Select(c => new NavPoint
{
...
})
.ToListAsync();
if (navpoint == null)
{
return NotFound();
}
return Ok(navpoint);
}
基本上你所擁有的是:
var navpoint = await _context.NavPoints
.Include(c => c.NavPointsParent)
.Include(c => c.Iscinstances)
Include
始終適用於查詢的根,因此您包含_context.NavPoints
Iscinstances
這將具有相同的效果:
var navpoint = await _context.NavPoints
.Include(c => c.Iscinstances)
.Include(c => c.NavPointsParent)
要Include
Iscinstances
的NavPointsParent
,請使用:
var navpoint = await _context.NavPoints
.Include(c => c.NavPointsParent)
.ThenInclude(c => c.Iscinstances)
ThenInclude
擴展了先前的Include
。
在您發表評論之后:這里的重點是您需要導航屬性c.NavPointsParent.Iscinstance
,即使不使用Include
也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.