C# 带有 Linq、内部连接、分组依据、排序依据的实体框架

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15340597/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 16:28:18  来源:igfitidea点击:

Entity Framework with Linq, inner Join, Group By, Order By

c#sqlentity-frameworklinqlinq-to-entities

提问by Markus_DE_HH

I have a SQL Query

我有一个 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 

And want to "translate" it to linq. Here is what I tried:

并想将其“翻译”为 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);

I dont know who to solve this with joins and the group by because all the time when i do a groupBy i cant access the other members.

我不知道谁可以通过加入和组来解决这个问题,因为我一直在执行 groupBy 时无法访问其他成员。

采纳答案by Sergey Berezovskiy

From data you provided, I think query should look like

根据您提供的数据,我认为查询应该如下所示

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)
}

Or with navigation properties:

或者使用导航属性:

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)
  });