This is a migrated thread and some comments may be shown as answers.

Best way to check for dependant objects

1 Answer 39 Views
Development (API, general questions)
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
IT
Top achievements
Rank 1
IT asked on 18 Aug 2011, 01:44 AM
If I have two persisted classes, a parent and child with a one to many relationship what is the best way to check if the parent has any children?

I know I can have constraints on the database to prevent me from deleting the parent when children are present, or I can set a dependency to cascade delete, however I want to be able to see if I *can* delete, without actually trying.

I'd like to implement a CanDelete() property on my parent object, so that I can do things in the UI layer (like showing/hiding a delete button) depending on whether I can delete an object.

Currently I'm checking the count of the child list to see if it has any members:-

private IList<Child> children = new List<Child>();
public IList<Child> Children { get { return children; } }
 
//...
 
public bool CanDelete() {
    return this.Children.Count == 0;
}

But I'm thinking this might not be the most efficient way... I'm not sure if by calling Count I'm forcing OA to load all children at a time when I might not need them.

Does anyone know of a better way to check for these dependant objects without having to load them?


Many thanks...

1 Answer, 1 is accepted

Sort by
0
Nikola
Telerik team
answered on 18 Aug 2011, 04:19 PM
Hello Aleks,

What your code does currently is triggering the lazy loading of the Children which results into executing a full scale query that fetches all of the data in the Children table, filtered by the primary key of the current Parent. To put it short - it's not very efficient. On the other hand though, your code is clean and readable so I wouldn't be too quick on removing it. I would personally choose this approach if I am working with relatively small chunks of data where the drawback of loading a bit more data from the database will not hurt the user experience.

What you can do to speed up the process is to work directly with the OpenAccessContext and call Count() on the Children object. Something like this:

        public bool CanDelete()
        {
            IObjectScope scope = Database.GetContext(this) as IObjectScope;
            if (scope == null)
            {
                return false;
            }
            
            return scope.Extent<Child>().Count(p => p.ParentID == this.ParentID) == 0;
        }


As you can see, this code is a bit more complicated but will trigger only a select count() statement into the database. 
Hope that helps and have a nice day.

Greetings, Nikola
the Telerik team

Explore the entire Telerik portfolio by downloading the Ultimate Collection trial package. Get now >>

Tags
Development (API, general questions)
Asked by
IT
Top achievements
Rank 1
Answers by
Nikola
Telerik team
Share this question
or