如何在不扩展到相关导航属性的情况下检索计算属性?

时间:2014-08-08 20:15:33

标签: breeze

我遵循了这里的好建议(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#代码,只是为了让它按照应有的方式工作。

2 个答案:

答案 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是否可以自己解决这个问题,但至少它可以将问题放在他们的雷达上。