我在我的系统中使用逻辑删除,并希望自动过滤对数据库的所有调用。
假设我以下列方式从数据库加载数据:
product.Regions
我如何过滤自Regions
EntitySet<Region>
后的所有请求而非自定义方法,因此不允许我添加isDeleted = 0
到目前为止,我找到了AssociateWith,但我不想为每个表写一行代码 - &gt;当前项目协会......
我正在研究构建通用lambda表达式还是......其他什么东西?
答案 0 :(得分:1)
您可以创建一个实现过滤器的扩展方法,并将其用作您的约定。
public static class RegionQuery
{
public static IQueryable<Region> GetAll(this IQueryable<Region> query, bool excludeDeleted=true)
{
if (excludeDeleted)
return query.Regions.Where(r => !r.isDeleted);
return query.Regions;
}
}
因此,无论何时您想要查询区域,您都可以进行以下调用,以便仅让实时区域也能够获得已删除的区域。
context.Regions.GetAll();
访问Products属性我有点不稳定,但仍然可行。唯一的问题是你必须遵守惯例。或者扩展包含类。
someProduct.Regions.GetAll();
我希望有所帮助。这就是我最终解决的问题,因为我无法在创建更多间接方式之外找到解决方案。如果您或其他任何人提出解决方案,请告诉我。我很感兴趣。
答案 1 :(得分:0)
在我看来,您正在使用Product和Region类之间的关系。如果是,那么某处(自动生成的LINQ-to-SQL的.dbml文件),存在一个定义关系的映射:
[Table(Name = "Product")]
public partial class Product
{
...
private EntitySet<Region> _Regions;
[Association(Storage = "_Regions")]
public EntitySet<Region> Regions
{
get { return this._Regions; }
set { this._Regions.Assign(value); }
}
...
}
您可以在此处在访问器中添加一些逻辑,例如:
public IEnumerable<Region> Regions
{
get { return this._Regions.Where(r => !r.isDeleted); }
set { this._Regions.Assign(value); }
}
这样,每次通过product.Regions访问都会返回已过滤的Enumerable。