求一个 linq 语句!

shadowno 2011-06-21 09:05:30

上图中,主键,外键,引用都已经建立了,

请教如何 用linq 语句 或 函数 一次查询出 如下结构 ,

员工姓名 年龄 业余爱好 专业技能

周锐 22 泡妞,踢球 dotnet , photoshop,3d建模
李强 23 听歌,散步,打豆豆 汽车驾驶,单品机开发
...全文
246 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
nierenyi 2011-06-22
  • 打赏
  • 举报
回复
linq,我还没去学,大家感觉怎么样
Charles雨林 2011-06-22
  • 打赏
  • 举报
回复
为什么要大家要纠结这个呢,如果linq带来的只有纠结和复杂的时候还不如不用,直接写SQL岂不是更快?
qq4004229 2011-06-22
  • 打赏
  • 举报
回复
果然是牛牛.....
shadowno 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fangxinggood 的回复:]

引用 2 楼 fangxinggood 的回复:

C# code
var query = from e in ctx.员工
let skills = (from s in ctx.员工技能 select new { s.employeeID, s.技能分类.skillName })
let hobbies = (from h in ctx.员工业余爱好 select new { h.……
[/Quote]

。。我马上试试。。。。函数方式。。。个人感觉比较方便。所以先试了。。
机器人 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fangxinggood 的回复:]

C# code
var query = from e in ctx.员工
let skills = (from s in ctx.员工技能 select new { s.employeeID, s.技能分类.skillName })
let hobbies = (from h in ctx.员工业余爱好 select new { h.emp……
[/Quote]

这个写法有啥问题吗?
shadowno 2011-06-21
  • 打赏
  • 举报
回复
实体关系,就是开始那个图了。。。实体是用 dbcontext generator 产生的。。。 关系上应该没问题吧?

EmpHobby=string.Join(",",e.EmpHobbies.Select(s=>s.Hobbies.Select(t=>t.HobbyName)),

但就是 ...e.EmpHobbies.Select(s=>s.Hobbies.Select(t=>t.HobbyName) 中 s=>s.Hobbies. 感知显示是Hobby对象了。。没有select 函数支持。。。
claymore1114 2011-06-21
  • 打赏
  • 举报
回复
按照 感知写,注意关系
shadowno 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 claymore1114 的回复:]

引用 9 楼 fangxinggood 的回复:
引用 8 楼 claymore1114 的回复:

既能 关系 都建好了, 那 实体类之间就有关系,试着 用关系 看看。
C# code

var query= from e in Employee
select new
{
Name=e.Name,
Age=e.Age,
……

employee 里没有外键。。。在em……
[/Quote]


怎么我的感知。。。
EmpHobby=string.Join(",",e.EmpHobbies.Select(s=>s.Hobbies.Select(t=>t.HobbyName)),
s=>s.Hobbies.是个对象...没有select 表达式选项了。。。
claymore1114 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fangxinggood 的回复:]
引用 8 楼 claymore1114 的回复:

既能 关系 都建好了, 那 实体类之间就有关系,试着 用关系 看看。
C# code

var query= from e in Employee
select new
{
Name=e.Name,
Age=e.Age,
……

employee 里没有外键。。。在employeeHobby 或者 employeeSkil……
[/Quote]
只是 类似 这种写法,还有深入的关系 接着再写。
EmpHobby=string.Join(",",e.EmpHobbies.Select(s=>s.Hobbies.Select(t=>t.HobbyName)),
机器人 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 claymore1114 的回复:]

既能 关系 都建好了, 那 实体类之间就有关系,试着 用关系 看看。
C# code

var query= from e in Employee
select new
{
Name=e.Name,
Age=e.Age,
……
[/Quote]
employee 里没有外键。。。在employeeHobby 或者 employeeSkills 里有navigation property
claymore1114 2011-06-21
  • 打赏
  • 举报
回复
既能 关系 都建好了, 那 实体类之间就有关系,试着 用关系 看看。

var query= from e in Employee
select new
{
Name=e.Name,
Age=e.Age,
EmpHobby=string.Join(",",e.EmpHobbies.Select(s=>s.HobbyName)),
Skill=string.Join(",",e.EmpSkills.Select(s=>s.SkillName))
};
shadowno 2011-06-21
  • 打赏
  • 举报
回复
能用函数方式实现吗? include...

using ( dbcontext db = new dbcontext()){

db.Employee.include(....).....

}
暖枫无敌 2011-06-21
  • 打赏
  • 举报
回复

楼上的几位大大,都写OK了,你看懂了就行了。
q107770540 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 codefighting 的回复:]

我同学说用SELECT NEW 很浪费资源的,不让我用。 是真的假的? 我都郁闷了,
我SELECT NEW 以后的LIST类型 怎么控? TOLIST有问题,有时间没办法就返回OBJECT类型了。
[/Quote]
SELECT NEW 一个匿名类 为何会浪费资源?

你如果想.ToList() 就添加一临时类 来存放数据

select new 临时类名{}
q107770540 2011-06-21
  • 打赏
  • 举报
回复

INSERT INTO Employee SELECT 'Tim',30,'China','10086' UNION ALL
SELECT 'Jim',22,'China','10086' UNION ALL
SELECT 'Tom',25,'China','10086' UNION ALL
SELECT 'Jack',38,'China','10086'

INSERT INTO Skill SELECT 'C#' UNION ALL
SELECT 'java' UNION ALL
SELECT 'JS' UNION ALL
SELECT 'CSS' UNION ALL
SELECT 'LINQ'

INSERT INTO EmpSkill SELECT 1,1 UNION ALL
SELECT 1,3 UNION ALL
SELECT 1,5 UNION ALL
SELECT 2,2

INSERT INTO Hobby SELECT '篮球' UNION ALL
SELECT 'dotnet' UNION ALL
SELECT 'photoshop' UNION ALL
SELECT '3d'

INSERT INTO EmpHobby SELECT 1,1 UNION ALL
SELECT 1,2 UNION ALL
SELECT 2,3 UNION ALL
SELECT 2,4 UNION ALL
SELECT 4,1 UNION ALL
SELECT 4,2






void Main()
{
var query=from e in Employee
select new
{
Name=e.Name,
Age=e.Age,
EmpHobby=string.Join(",", (from emp in Employee
join emh in EmpHobbies on emp.EmployeeID equals emh.EmployeeID into temp
from emh in temp.DefaultIfEmpty()
join h in Hobbies on emh.HobbyID equals h.HobbyID
where emp.EmployeeID==e.EmployeeID
select h.HobbyName).ToArray()),
Skill=string.Join(",", (from emp in Employee
join ems in EmpSkills on emp.EmployeeID equals ems.EmployeeID into temp
from ems in temp.DefaultIfEmpty()
join s in Skills on ems.SkillID equals s.SkillID
where emp.EmployeeID==e.EmployeeID
select s.SkillName).ToArray())
};

query.ToList().ForEach(q=>Console.WriteLine("{0}\t{1}\t{2}\t{3}\t",q.Name,q.Age,q.EmpHobby,q.Skill));

/*
Tim 30 篮球,dotnet C#,JS,LINQ
Jim 22 photoshop,3d java
Tom 25
Jack 38 篮球,dotnet
*/
}

codefighting 2011-06-21
  • 打赏
  • 举报
回复
我同学说用SELECT NEW 很浪费资源的,不让我用。 是真的假的? 我都郁闷了,
我SELECT NEW 以后的LIST类型 怎么控? TOLIST有问题,有时间没办法就返回OBJECT类型了。
机器人 2011-06-21
  • 打赏
  • 举报
回复
 var query = from e in ctx.员工
let skills = (from s in ctx.员工技能 select new { s.employeeID, s.技能分类.skillName })
let hobbies = (from h in ctx.员工业余爱好 select new { h.employeeID, h.业余爱好分类.hobbyName })
select new
{
e.employeeID,
e.name,
ss = skills.Where(x => x.employeeID == e.employeeID).Select(x => x.skillName),
hs = hobbies.Where(x => x.employeeID == e.employeeID).Select(x => x.hobbyName),
};
foreach (var q in query)
{
Console.WriteLine("{0}\t{1}\t{2}", q.employeeID, string.Join(",", q.ss), string.Join(",", q.hs));
}
q107770540 2011-06-21
  • 打赏
  • 举报
回复

var query=from e in Employee
join ek in EmpSkills on e.EmployeeID equals ek.EmployeeID into EmpSkill
from es in EmpSkills.DefaultIfEmpty()
group es by es.EmployeeID into g
let emp=Employee.SingleOrDefault(emp=>emp.EmployeeID==g.Key)
let skillIDs=g.Select(m=>m.SkillID)
select new
{
Name=emp.Name,
Age=emp.Age,
Skill=string.Join(",",Skills.Where(sk=>skillIDs.Contains(sk.SkillID)).Select(sk=>sk.SkillName).ToArray()),
};
q107770540 2011-06-21
  • 打赏
  • 举报
回复
var query = (from e in ctx.员工
select new
{
e.employeeID,
e.name,
ss = e.员工业余爱好.Select(s => s.业余爱好分类.hobbyName),
hs = e.员工技能.Select(s => s.技能分类.skillName),
}).ToList();
foreach (var q in query)
{
Console.WriteLine("{0}\t{1}\t{2}", q.employeeID, string.Join(",", q.ss), string.Join(",", q.hs));
}
shadowno 2011-06-21
  • 打赏
  • 举报
回复
string.Join有问题。。。。

LINQ to Entities 不识别方法“System.String Join(System.String, System.String[])”,因此该方法无法转换为存储表达式。
加载更多回复(9)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧