我遵循了这里的好建议(Handling calculated properties with breezejs and web api),允许Breeze访问我在服务器端的部分类中设置的计算属性:
public partial class EventPerson
{
[NotMapped]
public Decimal TotalAmountPaid
{
get
{
return this.EventPersonPayments.Sum(p => p.AmtPaid);
}
}
}
但对于我检索的每个EventPerson,除非我使用.expand(" EventPersonPayments")clientside或.Include(" EventPersonPayments")服务器端,否则此值显示为0。
我不希望将EventPersonPayments中的所有数据序列化并发送到客户端;我想要的只是总和值。这可能吗?
编辑:如果我的计算属性是从实体中已有的其他属性派生的,那么它可以正常工作。例如:
public partial class EventPerson
{
[NotMapped]
public String DisplayName
{
get
{
return this.FirstName + " " + this.LastName;
}
}
}
返回JSON有效内容中的DisplayName。除非我专门加载所有额外信息,否则以前计算的属性类型总是返回0或null。
我考虑将这些转换为SQL Server中的用户定义函数,但我不应该抛弃我的C#代码,只是为了让它按照应有的方式工作。
答案 0 :(得分:3)
一种方法是使用包含被查询实体和一些计算属性的投影。即您的服务器查询可能如下所示:
[HttpGet]
public IQueryable<Object> CustomersAndFreightTotals(companyName) {
var stuff = ContextProvider.Context.Customers
.Where(c => c.CompanyName.StartsWith(companyName))
.Select(c => new { Customer = c, FreightTotal = c.Orders.Sum(o => o.Freight)) });
return stuff;
}
此查询将加载以指定公司名称开头的所有客户,但也会为您提供&#34;总运费&#34;对于每个客户的所有订单。
您可以使用以下代码调用此代码:
var query = EntityQuery.from("CustomersAndFreightTotals")
.withParameters({ companyName: "C" });
myEntityManager.executeQuery(query).then(function(data) {
var results = data.results;
results.forEach(function (r) {
// note that each customer WILL also be added to the local entityManager
// because it is an entity, whereas the freightTotal is only available here.
var customer = r.Customer;
var freightTotal = r.FreightTotal;
// and if you wanted to hack the customer entity
// you could do this.
customer.freightTotal = freightTotal;
});
}
答案 1 :(得分:2)
我也遇到过这个问题,还有一些其他问题/答案似乎指向了什么:
根据我的理解,不久之后,[NotMapped]会阻止Breeze / Entity Framework正确连接到该字段。然而,Json.NET将序列化该字段并将其发送给Breeze,如果您通过类的构造函数手动设置它,将填充该字段,并且已通过使用expand来检索其他数据实体框架认可的财产。这似乎几乎是一个意外,你可以在这个给定的情况下让[NotMapped]字段在客户端上工作; Breeze + Entity Framework似乎并不是针对这种情况设计的。
您可以投票和评论suggestion at Breeze's User Voice。如果没有Entity Framework团队的一些工作,我不确定Breeze是否可以自己解决这个问题,但至少它可以将问题放在他们的雷达上。