根据“已删除”标志过滤LINQ结果

时间:2011-12-20 09:32:55

标签: c# sql linq

我有两个表,如下例所示,在MSSQL数据库中。

PROJECT
id
startDate
endDate

STORY
id
project_id
description
deleted_flag

在我的应用程序的逻辑中,我不希望用户能够真正“删除”一个对象,但我想给他们这种幻觉。因此,一旦故事被删除,“deleted_flag”将设置为true。

这一切都很好,但是当使用LINQ to SQL时,我遇到了与设计模式相关的问题。

我使用存储库模式,在我的存储库中,我的“FindAll()”方法包含过滤器Where(s =>!s.deleted_flag),以便当用户检索到Story列表时,它只显示未删除的。

我遇到的问题是在整个系统中强制执行此问题=问题是由于LINQ中父对象的可访问性,可以通过简单地使用

来获取未过滤的集合
Event e = EventsRepository.FindWithID(1);
var stories = e.Storys;

这将允许调用者甚至查看已删除的对象。

处理此问题的推荐方法是什么?

AK

2 个答案:

答案 0 :(得分:3)

创建一个与表几乎相同的行模式,但包括Where子句:

Create View vwStory
AS
SELECT id, project_id, description, deleted_flag
WHERE deleted_flag = 0

更改故事类的[Table]属性,以便它使用该视图而不是表格。

向视图添加INSTEAD OF个触发器,以便插入和更新传递到表中(您甚至可以使删除设置标志而不是删除行)。

Linq会将其视为与表相同,具有适当的select,update,insert和delete查询,但数据库将根据此视图的定义执行它们。

答案 1 :(得分:1)

您基本上有两种选择来强制执行该约束:

  1. 不要直接查询表,而是使用过滤了数据库端已删除行的视图。这样做的缺点是你的应用程序没有机会检索标记的记录(即从管理界面)。

  2. 不要通过删除L2Smodel中的关联来使用L2S生成的导航属性。该方法的缺点是,您必须通过存储库显式查询相关对象。