简体   繁体   中英

Complex graphing in entity framework

I can't seem to find the correct where clause to get only the items I need.

I have Divisions, these contain Categories en these contain Items. These are the classes:

public class Division    {
        public string Description { get; set; }

        public List<Category> Categories { get; set; }
    }

public class Category : IdEntity
{
    public string Description { get; set; }

    public Guid DivisionId { get; set; }

    public List<Item> Items { get; set; }
}

public class Item
{
    public Guid CategoryId { get; set; } 

    public DateTime Date { get; set; }

    public string Description { get; set; }
}

What I need is a division with the Id in a parameter, all the categories from this division and the items that have a certain date for each category.

So right now I do this:

public Division GetFullDivisionByIdAndDate(Guid id, DateTime date)
    {
        using (new ChangeTrackingScope(ChangeTracking.Disabled))
        {
            var divisionGraph = new Graph<Division>().Include(d => d.Categories.Select(c => c.Items));
            var division = _divisionDL.GetFullDivisionByIdAndDate(id, divisionGraph, date);
            return division;
        }
    }

And than in the DL I do

        public Division GetFullDivisionByIdAndDate(Guid id, Graph<Division> graph, DateTime date)
    {
        using (var db = new ContextScope<DatabaseContext>())
        {
            var q = graph.ApplySetReferences(db.Context.Divisions).AsNoTracking();
            return q.SingleOrDefault(p => p.Id == id);
        }
    }

Here I get the division with all its categories (so far so good) but I also get all items and I need only the items with the date given as parameter. Anyone has an idea how to do this?

Your code is not very accessible because of a few missing methods ( Graph , ApplySetReferences ) so I can't hook into it. But I can show a common way to query an object graph, which is by navigation properties. In you model, a basic query body could look like this:

from d in Divisions
from c in d.Categories
from i in c.Items
select new { Div = d.Description, Cat = c.Description, Item = i.Description }

Starting from here you can add other filters and properties, like

from d in Divisions.Where(div => div.Id == id)
from c in d.Categories
from i in c.Items.Where(item => item.Date == date)
select new { ... }

Or if you want a result with items in a filtered collection:

from d in Divisions.Where(div => div.Id == id)
from c in d.Categories
select new new { Div = d.Description,
                 Cat = c.Description,
                 Items = c.Items.Where(item => item.Date == date)
               }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM