【问题标题】:Linq query to join 4 tablesLinq 查询连接 4 个表
【发布时间】:2013-04-17 00:45:54
【问题描述】:

我有一个名为deliveries 的表,其中包含id、shiftid、occurrence、delfee 等列。我还有另外三个表 delcash、delcc、delsplit。 del cash 有列 (id,cost,paid),delcc 有列 (id,cccost,ccpaid,cashtip),delsplit 有列(id,cashcost,cashpaid,cccost,ccpaid)。 id 根据付款类型将交付条目链接到其他三个表之一。我正在尝试获取一个列表,其中表格以某种方式连接在一起,以便我可以遍历列表并在视图中获取一个表格,该表格按发生顺序显示每个交付以及每个交付的小费和交付费用。知道是否可以这样做吗?还是我应该只使用 SQL?

SELECT deliveries.occurrence, deliveries.delfee,delcash.cost,delcash.paid,delcc.cost,delcc.paid,delcc.cashtip,
delsplit.cashcost,delsplit.cashpaid,delsplit.cccost,delsplit.ccpaid
FROM deliveries
LEFT JOIN delcash
ON deliveries.id = delcash.id
LEFT JOIN delcc
ON deliveries.id = delcc.id
LEFT JOIN delsplit
ON deliveries.id = delsplit.id

【问题讨论】:

  • 你在使用实体框架吗?
  • 是的,我正在使用实体
  • 你能说明或给出每个表的外键是什么。
  • 交货有以下三种可能的付款方式之一:现金、信用或拆分。所以交付表中的id到其他三个表之一(delcash,delcc,delsplit)中的外键(id)
  • delcash.cost,delcash.paid,delcc.cost,delcc.paid,delcc.cashtip, delsplit.cashcost,delsplit.cashpaid,delsplit.cccost,delsplit.ccpaid 如果您选择这些项目,这有时会给您其他字段的空值。

标签: c# asp.net linq join


【解决方案1】:

您可以创建一个新类并让三个成本表从该类继承,然后您可以应用 Table per Concrete Type 策略来映射表。

见: http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx

或者重新设计您的数据库并应用 Table per type 策略。

【讨论】:

    【解决方案2】:

    试试这样的:

    var joinedDel = from delivery in tblDeliveries
                    join delC in tblDelCash on delivery.id equals delC.id
                    join delCC in tblDelCreditCard on delivery.id equals delCC.id
                    join delSplit in tblDelSplit on delivery.id equals delSplit.id
                    select new {
                          //Then create a new instance of Anonymous object where you will set all values of its properties
                          //For example, you can set ShiftID = delivery.ShiftID
                    };
    

    我还建议首先规范化您的表格(请参阅此link 供您参考)。这将使您更了解如何正确连接这些表。

    【讨论】:

    • 我认为我设置这些表的方式是标准化的?如果不能,您能否举一个具体示例说明如何正确规范化它们?
    • 我有一些与您在那里列出的内容非常相似的内容,除了它看起来像这样:从deliveries.id 上的db.delcashes 中的deliveries 加入delcashes 等于delcashes.id 加入db 中的delccs。在deliveries.id 上的delccs 等于delccs.id 在db.delsplits 中加入delsplits 在deliveries.id 上等于delsplits.id 选择新的deliverylistitem() 名称的差异来自Visual Studio 在创建模型时生成的名称。
    • 你能给出你连接表所需的属性吗?就像使用 SQL 一样,您需要选择需要包含哪些字段。例如,您需要 idShiftIdOccurenceDelete 详细信息。是的,您可以创建DeliveryListItem 对象的新实例并设置其属性。使用匿名对象只会让您的代码灵活地设置在已定义对象上找不到的不同属性。
    • 我在原始帖子中添加了我想要的 SQL 查询。
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多