Breezejs /淘汰赛 - 你如何组合实体?

时间:2013-11-04 21:17:42

标签: knockout.js breeze

我是breeze.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加载Employees及其LaborCategories。

然而,我仍然需要每个员工的预测时间。 。 。

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

我想在employee.ID上加入这两个结果实体。最终,我将在网格中使用此信息(通过knockout / 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; }
}

1 个答案:

答案 0 :(得分:2)

微风比这更强大,可以按照你想要的方式做到。

在BreezeController make:

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