表:Person(Id,Name),Project(Id,PersonId,Name)
关系一对多:Person.Id 对 Project.PersonId
我要查Person关联子表Project(Project表只取Id最大的一行)
用lambda表达式树怎么写?
我下面这个伪代码明显是有问题的,没有取Id最大的一个project,映射到PersonDto时会报错
var result = Person.Join(Project, ps => ps.Id, pj => pj.PersonId, (ps, pj) => new PersonDto { Id=ps.Id, PersonName=ps.Name, ProjectName=pj.Name }) .ToList();
“大神”脾气就是大,惹不起惹不起。
解决:
Person.GroupJoin(Project.OrderByDescending(p=> p.Id)
, ps => ps.Id
, pj => pj.PersonId
, (ps, pj) => new PersonDto
{
Id=ps.Id,
PersonName=ps.FirstOrDefault().Name,
ProjectName=pj.FirstOrDefault().Name
})
//Include Join都可以实现,只是被Last/LastOrDefault误导了(不能转换成SQL语句导致的错误),转而用orderby+first
var result = Person.Join(Project.where(c=>c.Id==Project.Max(m=>m.Id)), ps => ps.Id, pj => pj.PersonId, (ps, pj) => new PersonDto { Id=ps.Id, PersonName=ps.Name, ProjectName=pj.Name }) .ToList();
加一个条件先筛选最大的不就好了吗???
你确定?都没分组, join的这个Project只有一条数据?
@以后会觉得昵称很幼稚: 除非你的最大Id有多条记录,但是感觉你这个应该是自增长的。。。行不行的话试试不就知道了啊?
不行,这样只查出1条Person数据
@以后会觉得昵称很幼稚: 最大的Id如果只有一条记录,你说如果personId有几个,对应的Person能有几个?
@华临天下:
Person
101 张三
102 李四
Project
1 101 项目a
2 101 项目b
3 102 项目c
要取的结果
PersonDto
101 张三 项目b
102 李四 项目c
join里面应该这样写,我试试Join(Project.GroupBy(p=>p.PersonId)...
@以后会觉得昵称很幼稚: 那你这个跟你的问题去最大有关系吗???