我在哪里可以了解如何創建“動態”linq 運算式?我需要把它變成動態的,因為在物體框架的 OnModelCreating 中執行代碼時 currentUser 為空。我正在嘗試創建一個全域查詢過濾器。
User currentUser = currentUserService.GetUser();
IPermissionService permissionService = DependencyResolver.Current.GetService<IPermissionService>();
var allowedToSee = Entities.Where(e => permissionService.HasPermission(e, currentUser).View);
modelBuilder.Entity<Audit>().HasQueryFilter(x => allowedToSee.Contains(x.EntityType));
這是審計類:
public class Audit
{
// Information about changes
public virtual Entity EntityType { get; set; }
}
其他動態 linq 運算式的示例:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
//If the actual entity is an auditable type.
if(typeof(Auditable).IsAssignableFrom(entityType.ClrType))
{
//This adds (In a reflection type way), a Global Query Filter
//https://docs.microsoft.com/en-us/ef/core/querying/filters
//That always excludes deleted items. You can opt out by using dbSet.IgnoreQueryFilters()
var parameter = Expression.Parameter(entityType.ClrType, "p");
var deletedCheck = Expression.Lambda(Expression.Equal(Expression.Property(parameter, "DateDeleted"), Expression.Constant(null)), parameter);
modelBuilder.Entity(entityType.ClrType).HasQueryFilter(deletedCheck);
}
}
base.OnModelCreating(modelBuilder);
}
uj5u.com熱心網友回復:
假設您具有以下內容DbContext并且AllowedToSee屬性已正確實作,ApplyAuditFilters則應將查詢過濾器應用于所有Audit后代。
public class MyDbContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
ApplyAuditFilters(modelBuilder);
base.OnModelCreating(modelBuilder);
}
// implement this property
public IEnumerable<Entity> AllowedToSee => throw new NotImplementedException();
private void ApplyAuditFilters(ModelBuilder modelBuilder)
{
var types = modelBuilder.Model.GetEntityTypes()
.Where(et => typeof(Audit).IsAssignableFrom(et.ClrType));
var thisExpression = Expression.Constant(this);
// this.AllowedToSee
var allowedToSeeExpr = Expression.Property(thisExpression, nameof(AllowedToSee));
foreach (var et in types)
{
var param = Expression.Parameter(et.ClrType, "e");
// e.EntityType
var filterPropertyExpr = Expression.Property(param, nameof(Audit.EntityType));
// this.AllowedToSee.Contains(e.EntityType)
var filterBody = Expression.Call(typeof(Enumerable), nameof(Enumerable.Contains), new[] { typeof(Entity) },
allowedToSeeExpr, filterPropertyExpr);
// e => this.AllowedToSee.Contains(e.EntityType)
var queryFilter = Expression.Lambda(filterBody, param);
modelBuilder.Entity(et.ClrType).HasQueryFilter(queryFilter);
}
}
... // other members
}
uj5u.com熱心網友回復:
如果您需要“動態”linq,我建議使用System.Linq.Dynamic.Core。
這是它的檔案。
但是,我不確定這是否是您的最佳解決方案。但是如果你想動態生成 linq 運算式,那么這是一個很好且簡單的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515612.html
標籤:C#实体框架林克
