簡體   English   中英

ASP.NET EF6查詢模型

[英]ASP.NET EF6 Query Model

我有以下模型。 每個模塊都有一個嵌套的模塊類型的子代集合。 每個模塊還具有一組權限。

[DataContract(IsReference = true)]
public class Module
{
    [Key]
    [DataMember]
    public Guid ModuleId { get; set; }

    [Required]
    [StringLength(100)]
    [DataMember]
    public string Title { get; set; }

    [StringLength(100)]
    [DataMember]
    public string Description { get; set; }

    [StringLength(50)]
    [DataMember]
    public string Icon { get; set; }

    [Required]
    [RegularExpression(@"[^\s]+")]
    [StringLength(50)]
    [DataMember]
    public string Route { get; set; }

    [DataMember]
    public ICollection<Permission> Permissions { get; set; }

    [DataMember]
    public Guid? ParentModuleId { get; set; }

    [ForeignKey("ParentModuleId")]
    [DataMember]
    public virtual ICollection<Module> Children { get; set; }
}
[DataContract(IsReference = true)]
public class Permission
{
    [Key]
    [DataMember]
    public Guid PermissionId { get; set; }

    [Required]
    [StringLength(100)]
    [DataMember]
    public string Role { get; set; }

    [DataMember]
    public Guid ModuleId { get; set; }

    [ForeignKey("ModuleId")]
    [DataMember]
    public Module Module { get; set; }
}

我有一個Query All函數,如下所示,它將正確返回所有帶有其子節點的root。

public override IQueryable<Module> All()
    {
        return this.Context.Set<Module>().Include(c => c.Children).Where(p => p.ParentModuleId == null);
    }

現在,我想返回具有權限“ User”的子項的相同根目錄。 我該怎么做呢。 這是我到目前為止所擁有的。 這是正確的方法嗎? 請幫忙。

return this.Context.Set<Module>().Include(c => c.Children).Where(p => p.ParentModuleId == null).Include(p => p.Permissions).Where(s => s.Permissions.Any(r=>r.Role=="User"));

順便說一句,我不知道如何正確使用這些功能,例如包含,在任何地方,選擇許多功能。 任何教程或書籍對此表示贊賞。 我找不到任何關於此的好的教程,因為我不知道要搜索哪個關鍵字。 是這個EF還是LINQ。

Include方法告訴Entity Framework在進入數據庫以帶回記錄時填充該特定的導航屬性(即,它渴望加載數據而不是利用惰性加載,這需要EF稍后再返回數據庫)。 它不執行任何過濾。 所有這些都是通過“哪里”方法完成的。

要對所有孩子進行過濾,您需要做以下兩件事之一:

1)在SQL中創建一個通用表表達式,它將遞歸地獲取特定模塊的所有子級,將CTE放在SQL視圖中,將EF實體映射到該視圖,然后查詢該視圖,包括Join Permissions表格以僅獲取那些具有您要查找的權限的人。

2)要做到這一點而沒有T-SQL的樂趣,只需在Module類上使用[NotMapped]屬性創建一個遞歸函數,該遞歸函數將遍歷所有子項,並僅返回那些具有您所查找權限的子項for(注意:這將比第一個需要更多的資源,並且在您的應用程序中會變慢,因為這主要是LINQ to Objects查詢而不是LINQ to Entities)。

像這樣:

[NotMapped]
public List<Module> GrabModulesWithPermission(string permission)
{
  var toReturn = new List<Module>();

  if (this.Children != null && this.Children.Any(c => c.Permissions.Any(r => r.Role == permission))
  {
     toReturn.AddRange(this.Children.Where(c => c.Permissions.Any(r => r.Role == permission).SelectMany(c => c.GrabModulesWithPermission(permission)));
  }

  toReturn.Add(this);

  return toReturn;
}

就教程而言,我強烈建議您查看Pluralsight。 EF上有很多視頻,其中包括Microsoft EF MVP朱莉·勒曼(Julie Lerman)的一些視頻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM