Linq,内部Join,Group By,Order By的实体框架

Mar*_*_HH 18 c# sql linq linq-to-entities entity-framework

我有一个SQL查询

select Firma.Name as companyName, 
       Taetigkeit.Taetigkeit as skillName, 
       SUM(Zeit) as time
from Zeiterfassung 
inner join Firma On ZEiterfassung.FirmenID = Firma.ID    
inner join Taetigkeit on Zeiterfassung.TaetigkeitID = Taetigkeit.ID    
group by Taetigkeit, Firma.Name    
order by Firma.Name 
Run Code Online (Sandbox Code Playgroud)

并希望将其"翻译"为linq.这是我尝试过的:

var query = db.Zeiterfassung
              .Where(x => x.Firma.ID == x.FirmenID && x.TaetigkeitID == x.Taetigkeit.ID)
              .GroupBy(x => x.Taetigkeit.Taetigkeit1)
              .Select(x => new Evaluation() { skillName = x.Key, time = x.Sum(y => y.Zeit), //skillName = x.Sum(x => x.Zeit), })
              .OrderBy(x => x.skillName);
Run Code Online (Sandbox Code Playgroud)

我不知道是谁用连接和小组来解决这个问题,因为我总是在做一个小组时我无法访问其他成员.

Ser*_*kiy 41

根据您提供的数据,我认为查询应该是这样的

from z in db.Zeiterfassung
join f in db.Firma on z.FirmenID equals f.ID
join t in db.Taetigkeit on z.TaetigkeitID equals t.ID
select new { f.Name, t.Taetigkeit, z.Zeit) into x
group x by new { x.Taetigkeit, f.Name } into g
select new {
   CompanyName = g.Key.Name,
   SkillName = g.Key.Taetigkeit,
   Time = g.Sum(i => i.Zeit)
}
Run Code Online (Sandbox Code Playgroud)

或者使用导航属性:

db.Zeiterfassung
  .Select(z => new { z.Zeit, z.Taetigkeit.Taetigkeit1, z.Firma.Name })
  .GroupBy(x => new { x.Taetigkeit1, x.Name })
  .Select(g => new Evaluation {
       companyName = g.Key.Name,
       skillName = g.Key.Taetigkeit1, 
       time = g.Sum(y => y.Zeit)
  });
Run Code Online (Sandbox Code Playgroud)

  • 谢尔盖说,方法语法(这里的第二个代码示例)使用"导航属性".例如,请注意`Select`他如何使用z.Zeit(直接属性)z.Taetigkeit.Taetigkeit1(导航属性; OP在查询语法中通过`JOIN t in db.Taetigkeit`实现)和z.Firma.Name (导航属性; OP通过`db.Firma`中的JOIN f在查询语法中实现).我认为如果存在外键关系,则由EF自动创建导航属性.但如果没有外键关系呢?我们还能使用导航属性吗?我们必须先明确创建它们吗? (2认同)