-
Hi! Instead of having to set Tenantid query filter individually for each table, I'd like to set it for all tables that have TenantId column. Like this (see comments in code): public partial class MyDb : LinqToDB.Data.DataConnection
{
public long currentTenantId = 0;
partial void InitMappingSchema()
{
// Instead of having to specify query filter for each table like this:
var builder = MappingSchema.GetFluentMappingBuilder();
builder.Entity<MyTable>().HasQueryFilter<MyDb>((q, db) => q.Where(e => e.TenantId == currentTenantId));
builder.Entity<MyTable2>().HasQueryFilter<MyDb>((q, db) => q.Where(e => e.TenantId == currentTenantId));
// I would like to set it for all tables that have "TenantId" columns. But I can't get this to work:
var schema = DataProvider.GetSchemaProvider().GetSchema(this);
foreach (var table in schema.Tables)
{
if (table.Columns.Where(c => c.ColumnName == "TenantId").FirstOrDefault() != null)
{
builder.Entity<table.GetType()>().HasQueryFilter<MyDb>((q, db) => q.Where(e => e.TenantId == currentTenantId));
}
}
}
} Environment detailslinq2db version: Release 4.0.0-preview.1 |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments
-
Try this sample. It registers all entities which are part of MyDb class. For sure constructor should be corrected for your needs. public partial class MyDb : LinqToDB.Data.DataConnection
{
public long currentTenantId;
public MyDb()
{
AddMappingSchema(InitializedMappingSchema);
}
private static MethodInfo RegisterTenantMethodInfo =
MemberHelper.MethodOfGeneric(() => RegisterTenant<int>(null));
private static MappingSchema InitializedMappingSchema = InitMappingSchema();
public static MappingSchema InitMappingSchema()
{
var ms = new MappingSchema();
var builder = ms.GetFluentMappingBuilder();
var props = typeof(MyDb).GetProperties().Where(p => typeof(ITable<>).IsSameOrParentOf(p.PropertyType));
foreach (var prop in props)
{
var mi = RegisterTenantMethodInfo.MakeGenericMethod(prop.PropertyType.GetGenericArguments()[0]);
mi.Invoke(null, new object?[] {builder});
}
return ms;
}
public static void RegisterTenant<T>(FluentMappingBuilder builder)
{
var prop = typeof(T).GetProperty("TenantId");
if (prop == null)
return;
var entityParam = Expression.Parameter(typeof(T), "e");
var dbParam = Expression.Parameter(typeof(MyDb), "db");
var currentTenant = (Expression)Expression.PropertyOrField(dbParam, nameof(currentTenantId));
if (currentTenant.Type != prop.PropertyType)
currentTenant = Expression.Convert(currentTenant, prop.PropertyType);
var filterLambda =
Expression.Lambda<Func<T, MyDb, bool>>(
Expression.Equal(currentTenant,
Expression.MakeMemberAccess(entityParam, prop)), entityParam, dbParam);
builder.Entity<T>().HasQueryFilter(filterLambda);
}
public ITable<SampleClass> Some => GetTable<SampleClass>();
} |
Beta Was this translation helpful? Give feedback.
-
Hi @sdanyliv, I don't know how you find the time to be so helpful. |
Beta Was this translation helpful? Give feedback.
Try this sample. It registers all entities which are part of MyDb class. For sure constructor should be corrected for your needs.