使用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();