C# asp.net webforms脚手架,使用EF代码首先从数据库筛选记录

C# asp.net webforms脚手架,使用EF代码首先从数据库筛选记录,c#,asp.net,entity-framework,scaffolding,asp.net-dynamic-data,C#,Asp.net,Entity Framework,Scaffolding,Asp.net Dynamic Data,我首先使用数据库方法中的EF代码,并在asp.net web应用程序中创建CRUD操作。现在我想在整个应用程序中过滤一些记录 我有客户和产品类 客户: public partial class Client { public Client() { Product = new HashSet<Product>(); } [Key] public int ClientID { get; set; } [Required]

我首先使用数据库方法中的EF代码,并在asp.net web应用程序中创建CRUD操作。现在我想在整个应用程序中过滤一些记录

我有客户和产品类

客户:

public partial class Client
{
    public Client()
    {
        Product = new HashSet<Product>();
    }

    [Key]
    public int ClientID { get; set; }

    [Required]
    [StringLength(5000)]
    public string ClientName { get; set; }

    public string Status { get; set; }

    public virtual ICollection<Product> Product{ get; set; }
我想要的是使产品和客户具有Status=“Active”


我不想在每个页面上手动执行此操作,而是在类级别上进行定义,以便可以在使用FormView的Insert and Edit.aspx自动生成的动态页面上自动执行此操作。请建议可能的方法。

我的项目中有这样的工作方式:这允许您添加自己的筛选方法,或者只添加FilterByAttribute,指定筛选依据的列和筛选依据的值。这是通过检查getMethod的存在来实现的,getMethod的名称类似于GetTableName,并在每个表上进行检查。您需要在Global.asax文件中用AdvancedMetaModel替换元模型

希望这有帮助

    public class AdvancedMetaModel : MetaModel
{
    /// <summary>
    /// Creates the table.
    /// </summary>
    /// <param name="provider">The provider.</param>
    /// <returns></returns>
    protected override MetaTable CreateTable(TableProvider provider)
    {
        return new AdvancedMetaTable(this, provider);
    }
}

public class AdvancedMetaTable : MetaTable
{
    private SecureMetaModel SecureModel { get { return (SecureMetaModel)this.Model; } }

    public String GetMethodName { get; set; }

    private MethodInfo CreateQueryMethod { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="AdvancedMetaTable"/> class.
    /// </summary>
    /// <param name="metaModel">The meta model.</param>
    /// <param name="tableProvider">The table provider.</param>
    public AdvancedMetaTable(MetaModel metaModel, TableProvider tableProvider) :
        base(metaModel, tableProvider)
    {
        // set the Get Method Name
        var context = base.CreateContext();
        var getMethodName = DefaultGetMethodName;
        if (context != null && context.HasMethod(DefaultGetMethodName))
        {
            GetMethodName = getMethodName;
            this.CreateQueryMethod = this.DataContextType.GetMethod(GetMethodName);
        }
        else
            GetMethodName = String.Empty;

    }

    internal String DefaultGetMethodName
    {
        get { return String.Format("Get{0}", DataContextPropertyName); }
    }

    public override IQueryable GetQuery(object context)
    {
        var filterByAttribute = this.GetAttribute<FilterByAttribute>();

        if (this.CreateQueryMethod != null)
        {
            if (context == null)
                context = this.CreateContext();
            //this.Provider.GetQuery(context);
            var query = (IQueryable)this.CreateQueryMethod.Invoke(context, null);

            if (this.SortColumn != null)
                return query.GetQueryOrdered((MetaTable)this);
            else
                return query;
        }
        else if (filterByAttribute != null)
        {
            MetaColumn filterByColumn = this.GetColumn(filterByAttribute.ColumnName);
            var query = base.GetQuery(context).GetQueryFilteredByColumn(filterByColumn, filterByAttribute.ValueWhenTrue);
            return query;
        }
        else
        {
            var query = base.GetQuery(context);
            return query;
        }
    }
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]

Her是自定义get方法的一个示例

公共IQueryable GetStations() { var context=System.Web.HttpContext.Current; var stations=本站,其中(s=>s.Active)


}

注意,有一些缺少的扩展方法,如果您需要的话,它们只会把事情弄得一团糟。请直接给我发消息。
    public class AdvancedMetaModel : MetaModel
{
    /// <summary>
    /// Creates the table.
    /// </summary>
    /// <param name="provider">The provider.</param>
    /// <returns></returns>
    protected override MetaTable CreateTable(TableProvider provider)
    {
        return new AdvancedMetaTable(this, provider);
    }
}

public class AdvancedMetaTable : MetaTable
{
    private SecureMetaModel SecureModel { get { return (SecureMetaModel)this.Model; } }

    public String GetMethodName { get; set; }

    private MethodInfo CreateQueryMethod { get; set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="AdvancedMetaTable"/> class.
    /// </summary>
    /// <param name="metaModel">The meta model.</param>
    /// <param name="tableProvider">The table provider.</param>
    public AdvancedMetaTable(MetaModel metaModel, TableProvider tableProvider) :
        base(metaModel, tableProvider)
    {
        // set the Get Method Name
        var context = base.CreateContext();
        var getMethodName = DefaultGetMethodName;
        if (context != null && context.HasMethod(DefaultGetMethodName))
        {
            GetMethodName = getMethodName;
            this.CreateQueryMethod = this.DataContextType.GetMethod(GetMethodName);
        }
        else
            GetMethodName = String.Empty;

    }

    internal String DefaultGetMethodName
    {
        get { return String.Format("Get{0}", DataContextPropertyName); }
    }

    public override IQueryable GetQuery(object context)
    {
        var filterByAttribute = this.GetAttribute<FilterByAttribute>();

        if (this.CreateQueryMethod != null)
        {
            if (context == null)
                context = this.CreateContext();
            //this.Provider.GetQuery(context);
            var query = (IQueryable)this.CreateQueryMethod.Invoke(context, null);

            if (this.SortColumn != null)
                return query.GetQueryOrdered((MetaTable)this);
            else
                return query;
        }
        else if (filterByAttribute != null)
        {
            MetaColumn filterByColumn = this.GetColumn(filterByAttribute.ColumnName);
            var query = base.GetQuery(context).GetQueryFilteredByColumn(filterByColumn, filterByAttribute.ValueWhenTrue);
            return query;
        }
        else
        {
            var query = base.GetQuery(context);
            return query;
        }
    }
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public String ColumnName { get; set; }

public Object ValueWhenTrue { get; set; }

public FilterByAttribute(String columnName, Object valueWhenTrue)
{
    ColumnName = columnName;
    ValueWhenTrue = valueWhenTrue;
}
if (!context.User.IsInRole("Acctg") && !context.User.IsInRole("Execs"))
{
    var user = MembershipHelpers.GetUser();
    var stationIds = user.Stations.Select(s => s.Id).Distinct().ToList();
    stations = stations.Where(s => stationIds.Contains(s.Id));
}

return stations;