C# 如何使用LINQ从5个表中进行选择?
我有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
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();