我是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; }
}
答案 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)
}