i need generating more efficient linq query:
table: positions -positionid -name table: person -personid -name, etc... table: personposition -personid -positionid
i need result set groups people assigned each position:
positionid person 1 john bob frank 2 bill tom frank, etc...
my first thought linq query:
from perspos in personpositions join pers in persons on perspos.personid equals pers.personid group pers perspos.positionid groups select new {groups.key, groups}
which works great, produces following sql:
select [t0].[positionid] [key] [personposition] [t0] inner join [person] [t1] on [t0].[personid] = [t1].[personid] group [t0].[positionid] go -- region parameters declare @x1 int = 3 -- endregion select [t1].[personid], [t1].[userid], [t1].[firstname], [t1].[lastname], [t1].[email], [t1].[phone], [t1].[mobile], [t1].[comment], [t1].[permissions] [personposition] [t0] inner join [person] [t1] on [t0].[personid] = [t1].[personid] @x1 = [t0].[positionid] go -- region parameters declare @x1 int = 4 -- endregion select [t1].[personid], [t1].[userid], [t1].[firstname], [t1].[lastname], [t1].[email], [t1].[phone], [t1].[mobile], [t1].[comment], [t1].[permissions] [personposition] [t0] inner join [person] [t1] on [t0].[personid] = [t1].[personid] @x1 = [t0].[positionid] go -- region parameters declare @x1 int = 5 -- endregion select [t1].[personid], [t1].[userid], [t1].[firstname], [t1].[lastname], [t1].[email], [t1].[phone], [t1].[mobile], [t1].[comment], [t1].[permissions] [personposition] [t0] inner join [person] [t1] on [t0].[personid] = [t1].[personid] @x1 = [t0].[positionid] go on , on...
is there better linq query translates more efficient sql statement?
you should have relationship defined in database, , on dbml.
avoid doing joins when don't have to; tedious. let linq-to-sql you. should work:
var data = context.personpositions .select(pos => new { pos.positionid, pos.person }); return data.groupby(pos => pos.positionid);
or
return context.positions.select(pos => new { pos, pos.personpositions.select(pp => pp.person).tolist() }).tolist();
Comments
Post a Comment