LINQ к SQL: фильтр вложенные объекты с мягкими удалениями

StackOverflow https://stackoverflow.com/questions/2883201

Вопрос

Я использую мягкое удаление в моей базе данных (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);

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

Спасибо!

Это было полезно?

Решение

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

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

// 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();

Таким образом, это может быть замена для одной на один соотношение фильтрации на сложные данные, полученные.

Другие советы

Может быть, попробуйте:

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

Это даст вам нуль вместо файлов, где isdeleted верно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top