使用LinQ实体时,过滤DataContext进行的每个调用

时间:2009-09-29 17:37:57

标签: linq lambda datacontext

我在我的系统中使用逻辑删除,并希望自动过滤对数据库的所有调用。

假设我以下列方式从数据库加载数据:

product.Regions

我如何过滤自Regions EntitySet<Region>后的所有请求而非自定义方法,因此不允许我添加isDeleted = 0

到目前为止,我找到了AssociateWith,但我不想为每个表写一行代码 - &gt;当前项目协会......

我正在研究构建通用lambda表达式还是......其他什么东西?

2 个答案:

答案 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。