다음 모델이 있습니다. 각 모듈에는 모듈 유형의 하위 컬렉션이 있습니다. 각 모듈에는 권한 모음이 있습니다.ASP.NET EF6 쿼리 모델
[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; }
}
다음과 같이 모두 쿼리 루트 함수를 사용하여 모든 루트와 하위를 올바르게 반환합니다.
public override IQueryable<Module> All()
{
return this.Context.Set<Module>().Include(c => c.Children).Where(p => p.ParentModuleId == null);
}
이제 권한 "사용자"가있는 하위 항목과 동일한 루트 목록을 반환하고 싶습니다. 어떻게해야합니까? 이것은 내가 지금까지 가지고있는 것이다. 이렇게하는 올바른 방법입니까? 도와주세요.
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"));
btw, 나는이 기능을 적절하게 사용하는 방법, include, where, any, 많은 기능을 선택하는 방법을 모릅니다. 이것에 대한 모든 자습서 또는 책은 높이 평가됩니다. 내가 어떤 키워드를 검색할지 모르니까 나는 이것에 대한 좋은 튜토리얼을 찾을 수 없다. 이 EF 또는 LINQ입니까?
코드가 올바른 것처럼 보입니다. 문제가 있습니까? 하지만 루트 모듈의 권한 세트 만 검사하고 자식은 체크하지 않습니다. – Dan
나는 게으른 로딩이 기본적으로 활성화되어 있다고 덧붙이고 싶다. 즉, 게으른 로딩을 특별히 비활성화하지 않는 한'.Include'를 사용할 필요가 없다는 것을 의미한다. 직접 네비게이션 속성에 접근 할 수 있고 EF가 게으른로드 그것. – Dan
문제는 어린이들과 관련이 있습니다. 어린이들에 대한 허가를 확인하지 않고 있습니다. 나는 그것을 어떻게합니까? –