【问题标题】:Using Entity Framework, how do I access the number of employees (one entity) corresponding to each office (another entity)?使用实体框架,我如何访问每个办公室(另一个实体)对应的员工数量(一个实体)?
【发布时间】:2015-06-03 04:13:03
【问题描述】:

我有两个实体:一个员工实体和一个办公室实体。这两个实体之间存在一对多的关系——也就是说,一个办公室可能有很多员工,但每个员工只有一个办公室。

我正在使用 Entity Framework 6 来处理一个项目。我目前正在使用this tutorial 来学习如何使用实体框架创建一个简单的 Web 应用程序。我已经稍微修改了代码来玩弄我自己的实体。

现在我正在尝试让我的应用程序的“关于”页面显示每个办公室的员工人数。换句话说,我正在尝试创建一个双列表,其中第一列包含办公室的所有位置,第二列包含每个位置的相应员工人数。我相信这意味着我必须从每个数据库(表?)中提取数据,但是我不知道如何获取每个办公室的员工人数。获得总数很容易。我可以写以下查询:

NumOfEmployees = locationGroup.Count()

其中 locationGroup 是对来自两个实体的数据进行分组的变量,而 NumOfEmployees 是 LocationGroup 类的公共 int。这是我目前使用的代码块(大部分来自教程——我已经评论了我添加的部分)。

public ActionResult About()
{
    IQueryable<LocationGroup> data = from employee in db.Employees
            group employee by employee.FirstName into locationGroup

            //added the second pull of data from the other db
                                    from office in db.Offices
            group office by office.Location into locationGroup
            select new LocationGroup()
            {
                Location = locationGroup.Key,
                NumOfEmployees = locationGroup.Count() //modified this from original
            };
    return View(data.ToList());
}

从代码中可以看出,

NumOfEmployees = locationGroup.Count()

没有做我想让它做的事情。我希望它返回每个办公地点的员工人数,但它只返回员工总数并为每个办公地点写入。在我的 Employee.cs 类中,Employee 实体有一个可以引用的 OfficeID:

public class Employee
{
    public int EmployeeID { get; set; }
    public int OfficeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int PhoneNum { get; set; }
    public DateTime DoB { get; set; }
    public DateTime HireDate { get; set; }
    public string JobTitle { get; set; }
    public int Salary { get; set; }

    public virtual Office Office { get; set; }
}

所以我试图访问该 OfficeID 并使用条件语句,因此它只计算具有相应 OfficeID 的员工。我环顾四周寻找解决方案,但不知道是否可以使用特定的聚合查询在一行中执行此操作,或者是否需要创建一个循环来计算每个办公室的员工人数。问题是我不知道访问每个办公室拥有的每个员工人数的语法。我什至不知道如何在 select 子句中访问办公室 + 员工的属性

select new AddressGroup()

在上面的 About() 方法中,我也不需要。对上述 About() 方法的任何帮助将不胜感激。

编辑:我在下面添加了 Office 类:

public class Office
{
    public int ID { get; set; }
    public string Location { get; set; }
    public string BusinessName { get; set; }

    public virtual ICollection<Employee> Employees { get; set; }
}

【问题讨论】:

  • 你能把Office类文件贴出来吗? Office上是否有Employee的导航集合?
  • Office 上没有 Employees 集合吗?你不能在那个收藏上打电话给.Count()吗?
  • 您好,抱歉,这是我第一次在 Stack Overflow 上发帖。如果您是这个意思,我已经在我的原始帖子中添加了 Office 类文件。

标签: c# asp.net-mvc linq entity-framework entity


【解决方案1】:

这是对您的数据库进行分组和计数的最简单方法:

var result=db.Offices
  .Select(o=>new OfficeEmployeeCount{
    OfficeName=o.BusinessName,
    EmployeeCount=o.Employees.Count()});

然后创建你的类OfficeEmployeeCount:

public class OfficeEmployeeCount
{
  public string OfficeName {get;set;}
  public int EmployeeCount {get;set;}
}

并像这样在您的视图中访问它:

@model IQueryable<OfficeEmployeeCount>
<table>
<thead><tr><th>Office Name</th><th>Employees</th></tr></thead>
@foreach(var office in Model)
{
  <tr>
    <td>@office.OfficeName</td>
    <td>@office.EmployeeCount</td>
  </tr>
}
</table>

或者直接从您的控制器为办公室提供数据:

var result=db.Offices.Include(o=>o.Employees);
return View(result);

那么在你看来,你可以像这样访问:

@model IQueryable<Office>
<table>
<thead>
 <tr>
  <th>Office Name</th>
  <th>Employee Count</th>
  <th>Employee Names</th>
  <th>Employees</th>
 </tr>
</thead>
@foreach(var office in Model)
{
  <tr>
    <td>@office.BusinessName</td>
    <td>@office.Employees.Count()</td>
    <td>@String.Join(",",office.Employees.Select(e=>e.FirstName + " " + e.LastName))</td>
    <td>@foreach(var e in o.Employees)
    {
      @Html.ActionLink(e.FirstName + " " + e.LastName,"Details","Employees",new {ID=e.ID})
    }
    </td>
  </tr>
}
</table>

第一种方法在您的数据库上最简单,尤其是在您有大量员工的情况下。第二种方式在视图中更加灵活,比如如果你想再列出实际的员工。

【讨论】:

  • 您好,感谢您的回复。抱歉,我是数据库/实体框架/C# 的新手。如何使用上面的 var 结果查询?我不知道结果是什么类型。能够进行这种查询并将其分配给 NumOfEmployees 变量会很好,但它不会返回 int。基本上我要问的是这条线如何适应我已有的方法?
  • 你可以在同一个地方有多个办公室吗?
  • 编辑:我已经阅读了您的编辑,现在很有意义。我想避免创建类的方法。我想如果我有许多具有许多属性的实体并且必须进行大量此类查询,那将是非常低效的。这就是为什么我希望有一个简单的单行解决方案。
  • 不,抱歉,我没有说清楚。一间办公室 = 一个地点。
  • 那么上面的查询应该适合你。如果您有少量(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多