Visual Studio 2013 Rdlc - 如何显示导航属性的值

Visual Studio 2013 Rdlc - how to display values from navigation properties

我正在 visual studio 2013 年使用实体框架(代码优先)构建 WPF 应用程序。

我有一个订单 class,其中有一个虚拟 属性 客户。

public class Order
{
  public int OrderId { get; set; }
  public DateTime OrderDate { get; set;}
  public virtual Customer Customer { get; set; }
}

public class Customer
{
  public int CustomerId { get; set; }
  public string Name  { get; set; }
  public string DocumentNumber { get; set; }
  public DateTime BirthDate { get; set; }
}

我正在尝试在报告公式中显示客户的姓名。我试过:

=第一(字段!Customer.Value.Name,"MyDataSet")
=第一(字段!Customer.Name.Value,"MyDataSet")

=字段!Customer.Value.Name
=字段!Customer.Name.Value

它只是在该字段上显示#Error。订单中的其他字段显示正确。

有效:

=第一(字段!OrderDate.Value,"MyDataSet")

我在从上下文中检索实体时使用 Include 加载了 Customer。所以空引用不是问题。

Order order = context.Orders.Include(o => o.Customer).Where(o => o.OrderID == id).FirstOrDefault();

我搜索了以下内容和其他内容,但听起来像是只适用于 visual studio 2010 年或根本不起作用:
Bind child object property with in rdlc (Report)
http://wraithnath.blogspot.com.br/2011/04/reportviewer-object-datasource-nested.html

有没有什么我没有做的,或者我应该用另一种方式来解决这个问题,比如某种 "code-first-view"?

我不确定这是否是执行此类操作的公认标准,但我发现这是最可靠的。 (VS Rdlc 工作被窃听到地狱并且在 wpf 领域没有很好的记录)

因此,您拥有 'Order' 对象的数据集,其中包含您尝试从中访问属性的客户对象。现在,创建 'Customer' 对象的另一个数据集。

然后在代码中,像往常一样用所有内容填充 'Order' 对象,然后将我们基于 'Customer' 对象创建的第二个数据集的绑定源设置为 'Customer' 对象在你的 'Order' 对象

Order order = new Order();
order.OrderId = 1;
order.OrderDate = DateTime.Now;
order.Customer = new Customer("John", "Shmoe");

OrderBindingDataSet.DataSource = order;
CustomerBindingDataSet.DataSource = order.Customer;

希望这会有所帮助,我从个人经验中知道,必须使用这件作品以及几乎没有这些东西的文档是多么令人恼火。 :)

这个答案在 VS2013 中对我有用:

http://wraithnath.blogspot.com/2011/04/reportviewer-object-datasource-nested.html

确保你class满足要求,记住添加无参数构造函数,(它只对我有用,直到我添加无参数构造函数)

清单:

  • 所有 class 都是可序列化的(class 中的每个用户类型都必须是 可序列化,并且用户类型 属性 中的任何用户类型都必须是 可序列化)
  • 所有 classes 都有一个 public 无参数构造函数
  • 报告中使用的
  • ALLclasses 必须具有 public 修饰符
  • 如果数据源的任何 属性,或 属性 的任何 属性 不能 序列化然后你会得到#Error。只要确保一切 可序列化
  • 确保不会出现无限递归问题,例如,class A 有一个 属性 of class B,class B 有 属性 of class A。使用 XMLIgnore / ScriptIgnore 属性

这是我的 classes:

[Serializable]
public class Person
{
    public Person()
    {

    }
    public string Name{ get; set; }
    public string Address1{ get; set; }
    public string Id{ get; set; }
    public string Phone { get; set; }
}

家长:

[Serializable]
public class Header
{
    public Header()
    {

    }

    public string Product { get; set; }
    public DateTime EmisionDate{ get; set; }
    public string Number { get; set; }
    public Person Person { get; set; }
}

这是我的表情

=First(Fields!Person.Value.Name, "dsHeader")