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

本文关键字:属性 情况下 检索 计算 导航 | 更新日期: 2023-09-27 18:17:22

我遵循了这里的伟大建议(处理计算属性与breezejs和web api),以允许微风访问我的计算属性,我已经设置在一个部分类在服务器端:

    public partial class EventPerson
{
    [NotMapped]
    public Decimal TotalAmountPaid
    {
        get
        {
            return this.EventPersonPayments.Sum(p => p.AmtPaid);
        }
    }
}

但是对于我检索的每个EventPerson,该值显示为0,除非我使用。expand("EventPersonPayments")客户端或。include("EventPersonPayments")服务器端。

我不希望EventPersonPayments中的所有数据都被序列化并发送给客户端;我想要的是求和。这可能吗?

编辑:如果我计算的属性是从已经在实体中的其他属性派生的,它工作得很好。例如:

    public partial class EventPerson
{
    [NotMapped]
    public String DisplayName
    {
        get
        {
            return this.FirstName + " " + this.LastName;
        }
    }
}

返回JSON有效负载中的DisplayName。前一种类型的计算属性总是返回0或null,除非我特别加载了所有额外的信息。

我考虑过将这些转换为SQL Server中的用户定义函数,但我不应该只是为了使其按应有的方式工作而抛出我的c#代码。

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

一种方法是使用包含被查询的实体和一些计算属性的投影。例如,您的服务器查询可能像这样:

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

此查询将加载以指定公司名称开头的所有客户,但也将为每个客户提供所有订单的"总运费"。

你可以用这样的代码来调用它:

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

我也遇到了这个问题,还有一些其他的问题/答案似乎指向了正在发生的事情:

  • 我的未映射属性在微风中似乎不工作与投影
  • Angular/Breeze SPA模板上的UnMapped属性

从我的理解来看,简单地说,[NotMapped]阻止了Breeze/Entity Framework正确地连接到字段。然而,Json。NET将序列化该字段并将其发送给Breeze,如果您通过类的构造函数手动设置该字段,则Breeze将填充该字段,并且通过使用实体框架识别的其他属性的expand来检索数据。这似乎几乎是一个意外,你可以得到[NotMapped]字段工作在客户端在这个给定的情况下;Breeze+实体框架似乎不是为这种情况设计的。

在微风的用户声音有一个建议,你可以投票和评论。我不确定如果没有实体框架团队的一些工作,Breeze是否可以自己解决这个问题,但至少它可以把这个问题放在他们的雷达上。

相关文章: