【问题标题】:Entity Framework with Linq, inner Join, Group By, Order By具有 Linq、内部联接、分组依据、排序依据的实体框架
【发布时间】:2013-03-11 14:04:30
【问题描述】:

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

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

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

【问题讨论】:

  • 发布你到目前为止所尝试的内容。
  • 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);

标签: c# sql entity-framework linq linq-to-entities


【解决方案1】:

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

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

或者带有导航属性:

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

【讨论】:

  • 方法语法(这里的第二个代码示例)使用 Sergey 所说的“导航属性”。例如,在Select 中注意他如何使用 z.Zeit(直接属性)z.Taetigkeit.Taetigkeit1(导航属性;OP 在查询语法中由JOIN t in db.Taetigkeit 实现)和 z.Firma.Name(导航属性;OP由JOIN f in db.Firma 在查询语法中实现)。如果存在外键关系,我认为导航属性是由 EF 自动创建的。但是如果没有外键关系呢?我们还能使用导航属性吗?我们必须先明确地创建它们吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多