1

我似乎找不到正确的 where 子句来仅获取我需要的项目。

我有部门,这些包含类别,这些包含项目。这些是类:

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; }
}

我需要的是一个在参数中带有 Id 的部门,该部门的所有类别以及每个类别都有特定日期的项目。

所以现在我这样做:

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;
        }
    }

比在 DL 我做的

        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);
        }
    }

在这里,我得到了所有类别的划分(到目前为止一切都很好),但我也得到了所有项目,我只需要将日期作为参数给出的项目。任何人都知道如何做到这一点?

4

1 回答 1

1

由于缺少一些方法(Graph, ApplySetReferences),您的代码不是很容易访问,所以我无法使用它。但我可以展示一种查询对象图的常用方法,即通过导航属性。在您的模型中,基本查询主体可能如下所示:

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 }

从这里开始,您可以添加其他过滤器和属性,例如

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 { ... }

或者,如果您想要过滤集合中的项目的结果:

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)
               }
于 2012-11-22T23:16:36.370 回答