Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用LinQ实体时筛选DataContext发出的每个调用_Linq_Lambda_Datacontext - Fatal编程技术网

使用LinQ实体时筛选DataContext发出的每个调用

使用LinQ实体时筛选DataContext发出的每个调用,linq,lambda,datacontext,Linq,Lambda,Datacontext,我在我的系统中使用逻辑删除,希望对数据库的每个调用都进行自动筛选 假设我以以下方式从数据库加载数据: product.Regions 既然区域是一个实体集而不是一个自定义方法,因此不允许我添加isDeleted=0,我如何过滤每个请求 到目前为止,我发现AssociateWith,但我不想为当前项目的每个表->关联编写一行代码 我正在研究构建通用lambda表达式或。。还有什么吗?在我看来,您使用的是产品和区域类之间的关系。如果是这样,那么在某个地方(自动生成的LINQ到SQL的.dbml文件

我在我的系统中使用逻辑删除,希望对数据库的每个调用都进行自动筛选

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

product.Regions
既然
区域
是一个
实体集
而不是一个自定义方法,因此不允许我添加
isDeleted=0,我如何过滤每个请求

到目前为止,我发现AssociateWith,但我不想为当前项目的每个表->关联编写一行代码


我正在研究构建通用lambda表达式或。。还有什么吗?

在我看来,您使用的是产品和区域类之间的关系。如果是这样,那么在某个地方(自动生成的LINQ到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); }
    }
    ...
}
[表(Name=“产品”)]
公共部分类积
{
...
私有实体集(地区);
[关联(存储=“_区域”)]
公共实体集区域
{
获取{返回此。\区域;}
设置{this._Regions.Assign(value);}
}
...
}
您可以在访问器中添加一些逻辑,例如:

public IEnumerable<Region> Regions
{
    get { return this._Regions.Where(r => !r.isDeleted); }
    set { this._Regions.Assign(value); }
}
公共IEnumerable区域
{
获取{返回这个。_Regions.Where(r=>!r.isDeleted);}
设置{this._Regions.Assign(value);}
}

这样,通过product.Regions进行的每次访问都将返回筛选后的可枚举项。

您可以创建一个扩展方法来实现筛选,并将其用作惯例

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;
    }
}
访问Products属性可能有点不可靠,但仍然可行。唯一的问题是你必须遵守公约。或扩展包含的类

someProduct.Regions.GetAll();

我希望这有帮助。这就是我最终决定要做的,因为除了创建更多的间接寻址之外,我也找不到解决这个问题的方法。如果你或其他人想出了解决这个问题的办法,请告诉我。我很感兴趣。

希望你能找到答案。我记不起我多久写一次“.Where(I=>I.IsVisible)”:尽管这可能没有任何帮助-在NHibernate中使用过滤器或映射中的Where条件做这件事相当简单…+1供您评论,提醒我Linq到SQL不是唯一的or/M,有时解决方案不是那么容易获得;)在我的DBML中,我的实体之间确实存在关系。你的想法很好,但我必须为每个关系手动添加这些“过滤器”!!我正在研究一些更通用的东西。顺便说一句,这个.\u Regions.Where将返回IEnumerable而不是EntitySet。
someProduct.Regions.GetAll();