实体框架6 Linq结果为master-detail

时间:2014-04-06 12:43:23

标签: vb.net linq entity-framework

我尝试使用下表创建主 - 详细信息模型:

Orders
OrdID   DATE            CustID
========================================
1       01.01.2014      1
2       02.02.2014      2
3       03.03.2014      2
4       01.01.2014      4

OrderDetails
ID      OrdID   ProdID  Quantity
========================================
1       1       1       2
2       1       2       1
3       2       3       3
4       2       4       5

现在我想要一个Orders DataGridView和一个OrderDetails Datagridview 订单DGV应如下所示:

Orders
OrdID   DATE            Customer    Status
============================================
1       01.01.2014      CustOne     100%
2       02.02.2014      CustTwo     62.5%

并详细说明DGV(按所选订单过滤):

OrderDetails
ID      Prod        Quantity    Status
======================================
1       ProdOne     2       100%
2       ProdTwo     1       100%
3       ProdThree   3       0%
4       ProdFour    5       100%

假设OrderDetail中的状态字段是根据其他3-4个表中的数据计算的。 这些表格显示在表格中,它们包含一些与产品/订单相关的详细信息(生产状态,供应商等) 我使用Dataset和Datatables完成所有这些操作,将数据库中的所有表格转换为数据集,然后使用Linq结果进行所有计算,以填充其他表格之间具有必要关系的表格,因此我可以使用bindingsources将它们绑定到datagridviews for master-detail 。
现在我试图用EF来实现这个目标。我的目标是最小化从数据库中获取的数据,并在内存中执行所有计算,而不是在数据库中执行 有没有办法在EF中创建一个模型,它包含我需要的文件,以及来自上下文的数据,而不是来自数据库。(我拉动产品表,客户表,OrdersTable ,OrderDetails表等从数据库进入Context。后面的Orders DataGridView的表是使用来自所有这些表的连接创建的。我不想使用StoredProcedures从数据库中获取此表中的数据,我想使用它来获取它Linq来自已经在上下文中的表格。

问题是:
我有实体:

Order with properties: OrdID, DATE, CustID
    and navigation properties: Customer, Orders.

和实体:

OrderDetail with properties: ID, OrdID, ProdID, Quantity
    and navigation properties: Order, Product.

如何向实体添加属性,并计算此属性,类似于数据表中的Expression。 如何在datagridview上显示Orders集合,在每一行上显示Customer信息。

1 个答案:

答案 0 :(得分:1)

虽然回答你的问题还有很长的路要走,但我相信还有一种方法可以替代你想要实现的目标。

对于计算属性,您需要使用calculated属性创建一个Partial Class,但您需要确保首先填充导航属性:

'预填充数据并包含任何其他导航项

Dim Query = DataContext.Orders.Include("OrderDetails").Where(Function(t) t.OrderID = x)

'在OrderDetails实体上创建一个新的分部类,然后创建一个属性来计算状态:

Public Partial Class OrderDetails
    Public ReadOnly Property Status As String
        Return = (100 / Me.Quantity) & "%"
    End Property
End Class

理想情况下,您应该为每个数据网格创建一个视图模型,然后在填充它时,您可以创建特定于数据网格的功能/计算属性,但是通过在模型上创建部分类,您可以在任何模型中重复使用它。应用