Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq2db:查询对象层次结构的有效方法_C#_Postgresql_Linq2db - Fatal编程技术网

C# Linq2db:查询对象层次结构的有效方法

C# Linq2db:查询对象层次结构的有效方法,c#,postgresql,linq2db,C#,Postgresql,Linq2db,我使用的是c#和linq2db,具有以下类/表层次结构: public class YearlyTemplate { [Column] public int Id { get; set; } public List<MonthlyTemplate> MonthlyTemplates { get; set;} } public class MonthlyTemplate { [Column] public int Id { get; set;

我使用的是c#和linq2db,具有以下类/表层次结构:

public class YearlyTemplate
{
    [Column]
    public int Id { get; set; }
    public List<MonthlyTemplate> MonthlyTemplates { get; set;}
}

public class MonthlyTemplate
{
    [Column]
    public int Id { get; set; }

    [Column]
    public int YearlyTemplateId { get; set; }

    public YearlyTemplate YearlyTemplate{ get; set; }

    public List<DailyTemplate> DailyTemplates { get; set;}
}

public class DailyTemplate
{
    [Column]
    public int Id { get; set; }

    [Column]
    public int MonthlyTemplateId { get; set; }
    
    public MonthlyTemplate MonthlyTemplate { get; set; }
}

public class AppDataConnect : DataConnection
{
    public ITable<YearlyTemplate> YearlyTemplates => GetTable<YearlyTemplate>();
    public ITable<WeeklyTemplate> WeeklyTemplates => GetTable<WeeklyTemplate>();
    public ITable<DailyTemplate>  DailyTemplates => GetTable<DailyTemplate>();
}

公共类年模板
{
[专栏]
公共int Id{get;set;}
公共列表MonthlyTemplates{get;set;}
}
公共类月模板
{
[专栏]
公共int Id{get;set;}
[专栏]
public int YearlyTemplateId{get;set;}
public YearlyTemplate YearlyTemplate{get;set;}
公共列表DailyTemplates{get;set;}
}
公共类DailyTemplate
{
[专栏]
公共int Id{get;set;}
[专栏]
public int MonthlyTemplateId{get;set;}
public MonthlyTemplate MonthlyTemplate{get;set;}
}
公共类AppDataConnect:DataConnection
{
public ITable YearlyTemplates=>GetTable();
publicitable WeeklyTemplates=>GetTable();
public ITable DailyTemplates=>GetTable();
}
我想使用where语句从数据库中获取特定年份,但我想获取它的所有嵌套MonthlyTemplates,以及每个Monthlytemplate的所有DailyTemplates。 如何使用linq2db有效地实现这一点?
我想我应该使用group by,但它只适用于一个级别的深度。

这里没有什么特别之处。就像在EF内核中一样,linq2db包含用于快速加载的方法。 首先,您必须定义关联

public class YearlyTemplate
{
    [Column]
    public int Id { get; set; }

    [Association(ThisKey = nameof(YearlyTemplate.Id), OtherKey = nameof(MonthlyTemplate.YearlyTemplateId))]
    public List<MonthlyTemplate> MonthlyTemplates { get; set;}
}

public class MonthlyTemplate
{
    [Column]
    public int Id { get; set; }

    [Column]
    public int YearlyTemplateId { get; set; }

    public YearlyTemplate YearlyTemplate{ get; set; }

    [Association(ThisKey = nameof(MonthlyTemplate.Id), OtherKey = nameof(DailyTemplate.MonthlyTemplateId))]
    public List<DailyTemplate> DailyTemplates { get; set;}
}
或使用过滤器(使用/ThenLoad自定义LoadWith/ThenLoad的两种方法)

或者,您可以使用自定义投影,因为您只能选择所需的字段,因此可以更高效地使用自定义投影:

var query = 
  from y in db.YearlyTemplates
  where y.Id == 1
  select new 
  {
     Id = y.Id,
     MonthlyTemplates = y.MonthlyTemplates.Select(mt => new {
        mt.Id,
        DailyTemplates = mt.DailyTemplates.ToArray()
     }).ToArray()
  };

var result = query.ToArray();

这里没什么特别的。就像在EF内核中一样,linq2db包含用于快速加载的方法。 首先,您必须定义关联

public class YearlyTemplate
{
    [Column]
    public int Id { get; set; }

    [Association(ThisKey = nameof(YearlyTemplate.Id), OtherKey = nameof(MonthlyTemplate.YearlyTemplateId))]
    public List<MonthlyTemplate> MonthlyTemplates { get; set;}
}

public class MonthlyTemplate
{
    [Column]
    public int Id { get; set; }

    [Column]
    public int YearlyTemplateId { get; set; }

    public YearlyTemplate YearlyTemplate{ get; set; }

    [Association(ThisKey = nameof(MonthlyTemplate.Id), OtherKey = nameof(DailyTemplate.MonthlyTemplateId))]
    public List<DailyTemplate> DailyTemplates { get; set;}
}
或使用过滤器(使用/ThenLoad自定义LoadWith/ThenLoad的两种方法)

或者,您可以使用自定义投影,因为您只能选择所需的字段,因此可以更高效地使用自定义投影:

var query = 
  from y in db.YearlyTemplates
  where y.Id == 1
  select new 
  {
     Id = y.Id,
     MonthlyTemplates = y.MonthlyTemplates.Select(mt => new {
        mt.Id,
        DailyTemplates = mt.DailyTemplates.ToArray()
     }).ToArray()
  };

var result = query.ToArray();


ORM是一个有漏洞的抽象,这也是漏洞之一——ORM不能很好地处理报告查询,而报告查询无论如何都不能处理对象/实体。通常,这样的问题可以通过使用日历表来解决,例如,一个包含20年日期的表,其中包含索引覆盖的重新填充的年、月、日、季度、学期字段。要查找特定期间的记录,请加入日历表并按所需的年份或月份进行筛选。这个棘手的查询变成了一个单一的连接,并在索引列上进行过滤。不过,日历表是一个辅助表,在应用程序的数据或域模型中出现通常没有意义。您可以添加它,只是为了简化查询,或者您可以在数据库中创建一个使用日历表的视图/存储过程,并将结果映射到您的数据模型日期在哪里?你怎么知道哪一天是哪一天没有日期?您想要的是选择多个,但如果没有日期,它将无法工作。日期字段不是这种情况。我们不需要它;提供的层次结构只是原始层次结构的简化示例。因此,我们不需要关心日期,这就是为什么我不能同时使用日历的原因。我使用如下内容:var results=db_context.YearlyTemplate.SelectMany(x=>x.MonthlyTemplates.SelectMany(y=>y.dailymplates.Select(z=>new{yearlyID=x.Id,monthlyID=y.Id,dailyId=z.Id}))。ToList();ORM是一个有漏洞的抽象,这也是漏洞之一——ORM不能很好地处理报告查询,而报告查询无论如何都不能处理对象/实体。通常,这样的问题可以通过使用日历表来解决,例如,一个包含20年日期的表,其中包含索引覆盖的重新填充的年、月、日、季度、学期字段。要查找特定期间的记录,请加入日历表并按所需的年份或月份进行筛选。这个棘手的查询变成了一个单一的连接,并在索引列上进行过滤。不过,日历表是一个辅助表,在应用程序的数据或域模型中出现通常没有意义。您可以添加它,只是为了简化查询,或者您可以在数据库中创建一个使用日历表的视图/存储过程,并将结果映射到您的数据模型日期在哪里?你怎么知道哪一天是哪一天没有日期?您想要的是选择多个,但如果没有日期,它将无法工作。日期字段不是这种情况。我们不需要它;提供的层次结构只是原始层次结构的简化示例。因此,我们不需要关心日期,这就是为什么我不能同时使用日历的原因。我使用如下内容:var results=db_context.YearlyTemplate.SelectMany(x=>x.MonthlyTemplates.SelectMany(y=>y.dailymplates.Select(z=>new{yearlyID=x.Id,monthlyID=y.Id,dailyId=z.Id}))。ToList();非常感谢。你的回答就是我想要的评论。在linq2db文档中很难找到这样一个典型的功能。我不知道为什么。你知道我是否可以在你的例子中过滤日常模板吗?我不想从数据库中获取所有内容,只想获取过滤部分。用过滤器更新帖子。关于文档:需要志愿者。在这种情况下可以加入MonthlyTemplate吗?我想这样做:从db.YearlyTemplates.LoadWith(yt=>yt.MonthlyTemplates.LeftJoin(t=>t.AnotherTableId==AnotherTable.Id)中的y开始是的,这是可能的,但最好创建新问题。答案将是一个参考源。谢谢。你的答案就是我要找的注释。在linq2db文档中找到这样一个典型的功能并不容易。我不知道为什么。你知道我是否可以在你的示例中筛选DailyTemplates?我不想从数据库b中获得所有这些模板只是过滤部分。更新了带有过滤器的帖子。关于文档:需要志愿者。在这种情况下,是否可以为MonthlyTemplate创建联接?我想这样做:从db.YearlyTemplates.LoadWith中的y开始(yt=>yt.MonthlyTemplates.LeftJoin(t=>t.AnotherTableId==AnotherTable.Id)是的,这是可能的,但最好是提出新问题