Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何使用LINQ从5个表中进行选择?_C#_Linq - Fatal编程技术网

C# 如何使用LINQ从5个表中进行选择?

C# 如何使用LINQ从5个表中进行选择?,c#,linq,C#,Linq,我有5张桌子: course_id | course_name (course) ------------------------------ 1 | Basic1 2 | Basic2 3 | Basic3 4 | Basic4 5 | Basic5 course_id | trainer_id (course_trainer) ----------------------------- 1

我有5张桌子:

course_id | course_name    (course)
------------------------------    
    1     | Basic1
    2     | Basic2
    3     | Basic3
    4     | Basic4
    5     | Basic5

course_id | trainer_id (course_trainer)
-----------------------------
    1     |    1
    1     |    2
    2     |    2
    3     |    2
    4     |    3
    4     |    2
    5     |    3


course_id | topic_id (course_topic)
-----------------------------
    1     |    1
    1     |    2
    2     |    2
    3     |    2
    4     |    3
    4     |    2
    5     |    3

trainer_id| trainer_name (trainer)
-----------------------------
    1     |    Tom
    2     |    Thomas
    3     |    Sue

tropic_id | topic_name (topic)
-----------------------------
    1     |    Skill 1
    2     |    Skill 2
    3     |    Skill 3
如何使用LINQ进行选择,结果如下

Course_name    | Trainer_name     | Topic_name
----------------------------------------------
Basic 1        | Tom, Thomas      | Skill 1, Skill 2
Basic 2        | Thomas           | Skill 2
Basic 3        | Thomas           | Skill 2
Basic 4        | Sue, Thomas      | Skill 3, Skill 2
Basic 5        | Sue              | Skill 3
这是我用C编写的代码,但结果不正确。请帮帮我,非常感谢

public class course_datatable
{
    public string course_name {get; set;}
    public string trainer_name {get; set;}
    public string topic_name {get; set;}
}

IQueryable<course_datatable> coursequery =
    from c in db.course
    join ct in db.course_trainer on c.course_id equals ct.course_id
    join t in db.trainers on ct.trainer_id equals t.trainer_id
    join ctopic in db.course_topic on c.course_id equals ctopic.course_id
    join topic in db.topic on ctopic.topic_id equals topic.topic_id
    select new course_datatable()
    {
        course_name = c.course_name,
        trainer = t.trainer_name,
        topic = topic.topic_name
    };

从数据库中获取数据:

var result = context.Courses.Select(c => 
    new { Course = c, Trainers = c.Trainers, Skills = c.Skills }).ToList();
然后使用字符串展平训练员和技能对象。加入:

编辑

使用您的模式,我将重命名以使其正常工作

var result = db.course.Select(c => new 
{ 
    Course = c, 
    Trainers = c.course_trainer.trainers, 
    Skills = c.course_topic.topic 
}).ToList();

result.Select(r => new 
{ 
    Course = r.Course.course_Name, 
    Trainer = String.Join(",", r.Trainers.Select(t => t.trainer_name).ToArray()),
    Skill = String.Join(",", r.Skills.Select(S => S.topic_name).ToArray())
});

您可以在一条语句中完成这一切,但我以这种方式构建了它,希望它对您更清晰。

因为您似乎无法使用我的初始答案,这是首选答案,因为它不需要冗余的连接条件,我将使用您现有的代码,并向您展示如何进行分组和项目

从这一点开始:

var coursequery =
    from c in db.course
    join ct in db.course_trainer on c.course_id equals ct.course_id
    join t in db.trainers on ct.trainer_id equals t.trainer_id
    join ctopic in db.course_topic on c.course_id equals ctopic.course_id
    join topic in db.topic on ctopic.topic_id equals topic.topic_id
    select new course_datatable()
    {
        course_name = c.course_name,
        trainer = t.trainer_name,
        topic = topic.topic_name
    };
然后,您需要按课程名称分组

然后每个小组都需要投射到新的结果类型中

var result = groups.Select(group =>
    new course_datatable
    {
        course_name = group.Key,
        trainer_name = String.Join(",", group.Select(i=> i.trainer_name).ToArray()),
        topic_name = String.Join(",", group.Select(i => i.topic_name).ToArray()),
    }).ToList();
或者,如果您想尝试其他有趣的方法,请使用很少使用的LINQs聚合方法:

var result = groups.Select(group =>
    group.Aggregate((initial, next) =>
    {
        initial.topic_name += String.Format(", {0}", next.topic_name);
        initial.trainer_name += String.Format(", {0}", next.trainer_name);
        return initial;
    })).ToList();

您的查询看起来是正确的。您从中选择的所有集合是否已完全填充?你得到的结果是什么?你说“结果不正确”是什么意思?结果如何?您使用的是哪种LINQ提供者?@svick结果似乎不正确,因为它没有将培训师和技能集合合并到一行。@pickles-输出为:基本1-Tom-skill 1和基本1-Tom-skill 2和基本1-Thomas-skill 1和基本1-Thomas-skill2@svick:是的,我改正了。但是结果是这样的:基本的1-Tom-Skill 1和基本的1-Tom-Skill 2和基本的1-Thomas-Skill 1和基本的1-Thomas-Skill 2你确定这会起作用吗?因为它将尝试将第二个Select合并到SQL中。换句话说,通常的LINQ提供程序是否支持String.Join?@svick你完全正确-我刚刚添加了一个我忘记的ToList。干杯var result=context.Courses.Selectc=>new{Courses=c,Trainers=c.Trainers,Skills=c.Skills}.ToList;错误:课程不包含培训师和技能的定义,请查看。Thanks@Hainlp您应该能够根据属性的确切名称调整查询。毕竟,你想学习/赚取/传递你自己的优点。@Kirk Broadhurst-谢谢。我是一个初学者,我正在努力做到这一点。我可以通过电子邮件与您联系吗?我需要你帮我更多,我的电子邮件hainlp@yahoo.com. PleaseStill error coursequery不包含GroupBy的定义,也许我很愚蠢,但您是否测试过它。我的代码在ASP.NET C Visual Studio 2010中,数据库服务器是MS SQL server 2008。请帮助我您使用的是哪个.NET版本?确保你的班级有使用系统;在顶部,如果您使用的是.net4是的,我使用的是Systiem.Linq和.NET 4,我可以通过电子邮件将代码和数据库发送给您。我的电子邮件是hainlp@yahoo.com,如果您同意,请给我发送通知电子邮件,然后我再发送给您。我希望如此,但我无法付款。现在,我将尝试解决这个问题,请听从您的帮助。
var result = groups.Select(group =>
    new course_datatable
    {
        course_name = group.Key,
        trainer_name = String.Join(",", group.Select(i=> i.trainer_name).ToArray()),
        topic_name = String.Join(",", group.Select(i => i.topic_name).ToArray()),
    }).ToList();
var result = groups.Select(group =>
    group.Aggregate((initial, next) =>
    {
        initial.topic_name += String.Format(", {0}", next.topic_name);
        initial.trainer_name += String.Format(", {0}", next.trainer_name);
        return initial;
    })).ToList();