Фильтрация результатов LINQ на основе флага «удален» - PullRequest
3 голосов
/ 20 декабря 2011

У меня есть две таблицы, как в следующем примере, в базе данных MSSQL.

PROJECT
id
startDate
endDate

STORY
id
project_id
description
deleted_flag

В логике моего приложения я не хочу, чтобы пользователи могли по-настоящему "удалить" объектНо я хочу дать им эту иллюзию.В результате «удаленный_флаг» устанавливается в «истина» после удаления истории.

Это все хорошо, но при использовании LINQ to SQL у меня возникает проблема, связанная с шаблоном проектирования.

Я использую шаблон репозитория, и в моем репозитории для объектов Story мой метод FindAll () содержит фильтр Where (s =>! S.deleted_flag), так что при получении списка Story объектыПользователь, он показывает только не удаленные.

Проблема, с которой я столкнулся, заключается в ее применении по всей системе = Проблема в том, что благодаря доступности родительского объекта в LINQ можно получить нефильтрованныйсбор, просто используя

Event e = EventsRepository.FindWithID(1);
var stories = e.Storys;

Это позволит вызывающей стороне просматривать даже удаленные объекты.

Какой рекомендуемый способ борьбы с этим?

AK

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

Создайте представление в той же схеме строк, что и таблица, но с предложением Where:

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

Измените атрибут [Table] в классе истории, чтобы он использовал это представление, а неtable.

Добавить INSTEAD OF триггеры к представлению, чтобы вставки и обновления передавались в таблицу (можно даже удалить, установив флаг вместо удаления строк).

Linqбудет обрабатывать его так же, как таблицу, с соответствующими запросами select, update, insert и delete, но база данных выполнит их в соответствии с определением этого представления.

1 голос
/ 20 декабря 2011

У вас есть в основном два варианта для применения этого ограничения:

  1. Не запрашивайте таблицы напрямую, а используйте представления, которые фильтруют удаленные строки на стороне базы данных.Это имеет недостаток, заключающийся в том, что ваше приложение не имеет возможности извлекать отмеченные записи (например, из интерфейса администратора).

  2. Не используйте сгенерированные L2S навигационные свойства, удаляя ассоциации в вашей L2Smodel,Недостатком этого метода является то, что вам необходимо явно запрашивать связанный объект через ваш репозиторий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...