C# 将复杂对象与嵌套集合放在一起

C# 将复杂对象与嵌套集合放在一起,c#,sql,sql-server,linq,linq-to-sql,C#,Sql,Sql Server,Linq,Linq To Sql,表保存有关加载数据的信息。它的加载是我重命名为batch的东西(这可能不是一个完美的名称)。步骤和集合是已经定义的元表,它们的内容将来可能不会更新(至少不会删除任何旧内容)。集合是数据类型的定义,如“包含此或那个的csv文件”。好几套是一个步骤。几个步骤组成一批。一个集合可以绑定到多个步骤,因此可以重用该集合。实际(加载的)数据存储在其他表中,但这对于此特定任务并不重要 我有这个(简化的)DB结构: (日志表没有外键约束。) 我需要从中获得如下信息: public class JoinedMo

表保存有关加载数据的信息。它的加载是我重命名为batch的东西(这可能不是一个完美的名称)。步骤和集合是已经定义的元表,它们的内容将来可能不会更新(至少不会删除任何旧内容)。集合是数据类型的定义,如“包含此或那个的csv文件”。好几套是一个步骤。几个步骤组成一批。一个集合可以绑定到多个步骤,因此可以重用该集合。实际(加载的)数据存储在其他表中,但这对于此特定任务并不重要

我有这个(简化的)DB结构:

(日志表没有外键约束。)

我需要从中获得如下信息:

public class JoinedModel
{
    public Batch Batch { get; set; }
    public IEnumerable<Step> Steps { get; set; }
}

public class Step
{
    public int StepId { get; set; }
    public string Description { get; set; }
    public IEnumerable<Set> Sets { get; set; }
}

public class Set
{
    public int SetId { get; set; }
    public string Type { get; set; }
    public string EventCode { get; set; }
}
公共类JoinedModel
{
公共批处理{get;set;}
公共IEnumerable步骤{get;set;}
}
公共类步骤
{
public int StepId{get;set;}
公共字符串说明{get;set;}
公共IEnumerable集合{get;set;}
}
公共类集
{
public int SetId{get;set;}
公共字符串类型{get;set;}
公共字符串事件代码{get;set;}
}
如何将单个
批处理
与一组
步骤
对象连接起来,每个对象都有一组适当的
集合
对象(注意,输出集合类有事件代码,从
日志
事件
表中获取)

尝试了多个“来自”,连接,分组,但我不太擅长解决方案。是否可以从一条语句中生成这样的语句,或者我必须分别选择
Batch
,然后再获取其余语句?那怎么办

无法更改数据库设计。

请尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Logs> logs = new List<Logs>();
            List<Step> steps = new List<Step>();
            List<Set> sets = new List<Set>();
            List<Batch> batches = new List<Batch>();
            List<Event> events = new List<Event>(); 


            int BatchId = 123;

            var results = (from log in logs
                           join step in steps on log.Steps_StepId equals step.StepId
                           join set in sets on log.Sets_SetId equals set.SetId
                           join batch in batches on log.Batch_BatchId equals batch.BatchId
                           join _event in events on log.Events_EventId equals _event.EventId
                           select new { log = log, step = step, set = set, batch = batch, _event = _event })
                           .Where(x => x.batch.BatchId == BatchId)
                           .Select(x => new {
                               description = x.batch.Description,
                               eventCode = x._event.Code,
                               date = x.log.Date,
                               stepId = x.step.StepId,
                               stepDescription = x.step.Description,
                               setType = x.set.SetId
                           }).ToList();


        }

    }
    public class Logs
    {
        public int Batch_BatchId { get; set; }
        public int Steps_StepId { get; set; }
        public int Sets_SetId { get; set; }
        public DateTime Date { get; set; }
        public int Events_EventId { get; set; }

    }
    public class JoinedModel
    {
        public Batch batch { get; set; }
        public List<Step> Steps { get; set; }
    }

    public class Step
    {
        public int StepId { get; set; }
        public string Description { get; set; }
        public List<Set> Sets { get; set; }
    }

    public class Set
    {
        public int SetId { get; set; }
        public string Type { get; set; }
        public string EventCode { get; set; }
    }
    public class Batch
    {
        public int BatchId { get; set; }
        public string Description { get; set; }
    }
    public class Event
    {
        public int EventId { get; set; }
        public int Code { get; set; }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
列表日志=新列表();
列表步骤=新建列表();
列表集=新列表();
列表批次=新列表();
列表事件=新列表();
int BatchId=123;
var结果=(来自登录日志)
在log.steps\u StepId等于step.StepId的步骤中加入步骤
在log.sets\u SetId等于set.SetId的集合中连接集合
在log.batch\u BatchId等于batch.BatchId上批量联接批
在日志上的事件中加入\u事件\u EventId等于\u event.EventId
选择新{log=log,step=step,set=set,batch=batch,_event=_event})
.其中(x=>x.batch.BatchId==BatchId)
.选择(x=>new{
description=x.batch.description,
eventCode=x.\u event.Code,
日期=x.log.date,
stepId=x.step.stepId,
步骤说明=x.step.Description,
setType=x.set.SetId
}).ToList();
}
}
公共类日志
{
public int Batch_BatchId{get;set;}
public int Steps_StepId{get;set;}
公共整数集_SetId{get;set;}
公共日期时间日期{get;set;}
public int Events_EventId{get;set;}
}
公共类联合模型
{
公共批处理{get;set;}
公共列表步骤{get;set;}
}
公共类步骤
{
public int StepId{get;set;}
公共字符串说明{get;set;}
公共列表集{get;set;}
}
公共类集
{
public int SetId{get;set;}
公共字符串类型{get;set;}
公共字符串事件代码{get;set;}
}
公共类批处理
{
public int BatchId{get;set;}
公共字符串说明{get;set;}
}
公开课活动
{
public int EventId{get;set;}
公共整数代码{get;set;}
}
}

“从……尝试了多次”我没有看到任何尝试。您想要EF解决方案吗?纯SQL?LINQtoSQL?正如标签中所说的(虽然已经足够了),一个LINQtoSQL。我们做了很多尝试,但事实上,没有达到预期效果,我不知道哪一个可能会“有帮助”并代表性地补充这个问题。我不确定你的模型是否合乎逻辑。你说几个集合构成一个步骤,但是在你的模型中,几个步骤也构成一个集合(多对多关系通过映射表记录)!日志和步骤之间以及日志和集合之间也存在一对一的关系,这意味着不能将包含多个集合的步骤或包含多个步骤的集合输入到日志表中。我认为您可能需要回到绘图板上,或者更具体地说明您试图实现的目标,以便我们可以就设计提供建议。