LINQ to SQL: фильтровать вложенные объекты с мягким удалением - PullRequest
1 голос
/ 21 мая 2010

Я использую мягкое удаление в своей базе данных (поле IsDeleted). Я активно использую методы LoadWith и AssociateWith для извлечения и фильтрации вложенных записей.

Дело в том, что AssociateWith работает только со свойствами, которые представляют отношение один-ко-многим.

DataLoadOptions loadOptions = new DataLoadOptions();
loadOption.LoadWith<User>(u = > u.Roles);
loadOption.AssociateWith<User>(u = > u.Roles.Where(r = > !r.IsDeleted));

В приведенном выше примере я просто говорю: Я хочу получить пользователей со связанными (не удаленными) ролями .

Но когда у меня отношения один на один, например, Document -> File (только один файл связан с документом) Я не могу отфильтровать мягкий удаленный объект:

DataLoadOptions loadOptions = new DataLoadOptions();
loadOption.LoadWith<Document>(d = > d.File);
// the next certainly won't work
loadOption.AssociateWith<File>(f = > !f.IsDeleted);

Итак, есть ли идея, как фильтровать записи в отношениях один-к-одному?

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 июня 2010

До сих пор я нашел только одно подходящее решение для этого (кроме того, чтобы вообще не использовать мягкое удаление): удалить отношение мягкого удаления при обновлении сущности.

например. когда я решил удалить файл из документа, я выполняю что-то вроде:

// this may be a part of update method
var file = document.File;
if (file.IsDeleted)
{
    // attach soft deleted file
    context.Files.Attach(file, true); 

    // remove a file reference
    document.File = null;
}

// attach document entity and submit changes
context.Documents.Attach(document, true);
context.SubmitChanges();

Таким образом, это может заменить взаимно-однозначную фильтрацию при сложном извлечении данных.

0 голосов
/ 21 мая 2010

может быть попробовать:

loadOptions.AssociateWith<File>(f => f.IsDeleted ? null : f);

это даст вам ноль вместо файлов, где IsDeleted имеет значение true.

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