Веб-форма asp.net сначала формирует EF Code из записей фильтра базы данных
Я использую EF Code First из базы данных и создал операции CRUD в веб-приложении asp.net. Теперь я хочу отфильтровать некоторые записи по всему приложению.
У меня есть классы Client и Product
Клиент:
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, где используются формы. Пожалуйста, предложите возможный путь.
2 ответа
Ее пример пользовательского метода get
public IQueryable GetStations() { var context = 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;
}
У меня это работает в моем проекте следующим образом: это позволяет вам добавить свой собственный метод фильтра или просто добавить 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)]
public class FilterByAttribute: Attribute {// это свойство требуется для работы с "AllowMultiple = true" ref David Ebbo // Как реализовано, этот идентификатор является просто типом атрибута. Однако // предполагается, что уникальный идентификатор будет использоваться для идентификации двух // атрибутов одного типа. открытый переопределенный объект TypeId { get { return this; } }
public String ColumnName { get; set; }
public Object ValueWhenTrue { get; set; }
public FilterByAttribute(String columnName, Object valueWhenTrue)
{
ColumnName = columnName;
ValueWhenTrue = valueWhenTrue;
}