1

我对微风.js 很陌生,我需要能够组合两个实体。

现在我无法在一个查询中获得我需要的所有信息。我的解决方案是分别获取两个实体,然后在代码中组合。

这是两个查询:

         var query = breeze.EntityQuery
        .from("EmployeeLaborTasks")
        .where("task_ID", "==", taskID)
        .orderBy("employee_ID")
        .expand(["Employee", "LaborCategory"]);


         var query = breeze.EntityQuery
        .from("ForecastedHours")
        .where("task_ID", "==", taskID)
        .expand("Employee");

EmployeeLaborTasks 是一个连接表,其中包含 taskID、employeeID 和 LaborCategoryID 的外键。这允许我根据 taskID 加载员工及其 LaborCategories。

但是,我仍然需要每个员工的 predictedHours。. .

ForecastedHours 按月输入,因此员工在一年中可能有许多条目(最多 12 个)。因此,没有可用于将 ForecastedHours 添加到第一个查询的适用导航属性。此表包含 taskID 和employeeID 的外键。因此,第二个是必要的。

我想在employee.ID 上加入这两个生成的实体。最终,我将在网格中使用这些信息(通过淘汰赛/Durandal),显示员工姓名、劳动类别和 12 个月内的预测小时数。

这可能吗?加入这些实体会破坏任何使信息可更新的 Breeze.js 跟踪吗?

我也想知道通过淘汰赛的 ko.computed 将它们组合起来是否更好,但我不知道该怎么做。

任何帮助将不胜感激。


为了回应下面的 Dominictus,我发布了相关表格的数据模型:

public class Employee : Person
{
    [Key]
    public int ID { get; set; }
    public string CompanyEmployeeID { get; set; }
    public decimal Salary { get; set; }
    public decimal UtilizationTarget { get; set; }
    public virtual Office OfficeLocation { get; set; }
    public virtual Department Department { get; set; }
    public virtual JobGrade JobGrade { get; set; } 
}



public class EmployeeLaborTasks
{
    [Key]
    public int ID { get; set; }

    public virtual Employee Employee { get; set; }
    [ForeignKey("Employee")]
    public int Employee_ID { get; set; }

    public virtual Task Task { get; set; }
    [ForeignKey("Task")]
    public int Task_ID { get; set; }

    public virtual LaborCategory LaborCategory { get; set; }
    [ForeignKey("LaborCategory")]
    public int LaborCategory_ID { get; set; }
}


public class ForecastedHours
{
    [Key]
    public int ID { get; set; }
    [Required]
    public double Hours { get; set; }
    [Required]
    public DateTime Date { get; set; }

    [Timestamp]
    public Byte[] LastModified { get; set; }
    public virtual User ModifiedBy { get; set; }

    public virtual Employee Employee { get; set; }
    public virtual Task Task { get; set; }

    [ForeignKey("Task")]
    public int Task_ID { get; set; }

    [ForeignKey("Employee")]
    public int Employee_ID { get; set; }
}


public class Task
{
    [Key]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    public int Number { get; set; }

    [ForeignKey("Contract")]
    public int ContractID { get; set; }

    public virtual Contract Contract { get; set; }

    [Timestamp]
    public Byte[] LastModified { get; set; }
    public virtual User ModifiedBy { get; set; }
}


public class LaborCategory
{
    [Key]
    public int ID { get; set; }
    [Required]
    public string Name { get; set; }
    public decimal Rate { get; set; }
    public virtual Contract Contract { get; set; }
    [Timestamp]
    public Byte[] LastModified { get; set; }
    public virtual User ModifiedBy { get; set; }
}
4

1 回答 1

2

Breeze 比这更强大一点,可以按照您想要的方式进行操作。

在 BreezeController 中制作:

[HttpGet]
public IQueryable<EmployeeLaborTasks> NameHere(){
    return _contextProvider.Context.EmployeeLaborTasks.Include("Employee").Include("LaborCategory").Include("Employee.ForecastedHours");
}

我会假设员工有

public virtual <ForecastedHour> ForecastedHours {get;set;}

并且 EmployeeLaborTasks (这仅适用于员工,应该为所有其他连接定义)具有

public int EmployeeId {get;set;}
[ForeignKey("EmployeeId")]
public Employee Employee {get;set;}

之后,您只能在客户端上编写一个查询:

var query = breeze.EntityQuery
    .from("NameHere")
    .where("task_ID", "==", taskID)
    .orderBy("employee_ID")

您将所有这些都放入一个可观察的变量中。要将其放入网格中,您可以执行以下操作(此处为伪代码):

foreach employeeLaborTasks as singleTask{
   display (singleTask.employee.name)
   display (singleTask.laborCategory.name)
   foreach (singleTask.employee.forecastedHours as singleForecast){
      display (singleForecast.name)
   }
   display (newline)
}
于 2013-11-05T09:49:45.593 回答