0

Я использую EF Code First from Database и создаю операции CRUD в веб-приложении asp.net. Теперь я хочу отфильтровать некоторые записи в приложении.asp.net webforms scaffolding с EF Code сначала из записей фильтра базы данных

У меня есть клиент и продуктов класса

Клиент:

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; } 

продукта:

public partial class Product 
{ 
    public Product() 
    { 

    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Status { get; set; } 
    public virtual Client Client { get; set; } 

То, что я хочу, чтобы получить продукты и клиенты, имеющие статус = "Активный"

Я не хочу делать это вручную на каждой странице, а скорее определяю на уровне класса, поэтому это может быть сделано автоматически специально для автоматических сгенерированных динамических страниц Insert и Edit.aspx, где используются Formviews. Просьба предложить возможный путь.

ответ

0

У меня это работает в моем проекте следующим образом: это позволяет вам добавить собственный метод фильтрации или просто добавить FilterByAttribute, указав, какой столбец будет фильтроваться и какое значение для фильтрации. Это работает, проверяя существование getMethod, где имя похоже на GetTableName и проверяется для каждой таблицы. вам нужно будет подставить MetaModel с помощью AdvancedMetaModel в файл Global.asax.

надеюсь, что это поможет.

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)] 

класс FilterByAttribute общественности: Атрибут { // это свойство необходимо для работы с «AllowMultiple = истина» ссылка Дэвид Эббо // Как реализуется этот идентификатор является просто тип атрибута. Однако // предполагается, что для идентификации двух атрибутов // используется один и тот же тип. public override object TypeId {get {return this; }}

public String ColumnName { get; set; } 

public Object ValueWhenTrue { get; set; } 

public FilterByAttribute(String columnName, Object valueWhenTrue) 
{ 
    ColumnName = columnName; 
    ValueWhenTrue = valueWhenTrue; 
} 
+0

Примечание Есть некоторые отсутствующие методы расширения, которые бы просто Беспорядок это, если вы хотите их пожалуйста сообщение мне непосредственно. – Wizzard

0

Ее является примером пользовательского Получа

общественного IQueryable GetStations() { уага контекста = System.Web.HttpContext.Current; var station = this.Stations.Where (s => s.Active);

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; 

}