Home > Net >  EF Dynamic Filters delegate expression
EF Dynamic Filters delegate expression

Time:07-07

We are using EF Dynamic filters (ASP.NET MVC 5 app) https://entityframework-dynamicfilters.net/overview

The filter below is working, but set only once.

builder.Filter("IMultiOrganization", (IMultOrganization d) => ((d.TenantId == GlobalAppVariables.IssuerId) && (d.IsShared == true)) || ((d.IsShared == false && d.AzureObjIdentifier == GlobalAppVariables.AzureObjIdentifier)));

The variables 'IssuerId' and 'AzureObjIdentifier' are dynamic session variables, those are changing all the time. This causes problems and I would like the filter to use those variables straight from the session.

According to the documentation this is caused because this filer isn't a delegate expression.

Filters can be defined on a specific entity class or an interface by providing a specific value, e.g. an IsDeleted filter created on an ISoftDelete interface which will automatically filter those entities by applying the condition "IsDeleted==false".

Filter values can also be provided via a delegate/expression instead of a specific value which allows you to change the parameter value dynamically. For example, a filter can be created on the UserID and provided per HTTP request.

We also use delegate filters what indeed is working fine.

builder.EnableFilter("IMultiTenant", () => GlobalAppVariables.AzureObjIdentifier != null || GlobalAppVariables.IssuerId != Guid.Empty);

But I can't get the first filter work as a delegate expression and need a bit help on that.

CodePudding user response:

I found the solution by using parameters within the filter.

First of all I changed the filter which now supports parameters.

builder.Filter("IMultiOrganization", (IMultiOrganization d, Guid tenantId, string azureId) => (d.TenantId == tenantId && d.IsShared == true) || (d.AzureObjIdentifier == azureId && d.IsShared == false), GlobalAppVariables.IssuerId, GlobalAppVariables.AzureObjIdentifier);

Then I call method below in the db context constructor

private void SetMultiOrganizationFilterParams()
    {
        if (GetFilterEnabled("IMultiOrganization"))
        {
            this.SetFilterScopedParameterValue("IMultiOrganization", "azureId", GlobalAppVariables.AzureObjIdentifier);
            this.SetFilterScopedParameterValue("IMultiOrganization", "tenantId", GlobalAppVariables.IssuerId);
        }
    }

Source: https://github.com/zzzprojects/EntityFramework.DynamicFilters#changing-filter-parameter-values

  • Related