首页 > 解决方案 > Kentico 10 ObjectQuery 连接多个表

问题描述

我基本上是在尝试运行一个查询,为我提供所有购买了具有特定 SKU 产品的用户。基本上这个SQL在这里:

SELECT u.FirstName, u.LastName, u.Email
FROM COM_OrderItem oi INNER JOIN COM_Order o ON oi.OrderItemOrderID = o.OrderID
    INNER JOIN COM_Customer c ON o.OrderCustomerID = c.CustomerID
    INNER JOIN CMS_User u ON c.CustomerUserID = u.UserID
WHERE oi.OrderItemSKUID = 1013

我试图使用 ObjectQuery API 来尝试实现这一点,但不知道如何做到这一点。此处的文档不涵盖我正在寻找的特定类型的场景。我想出这个只是为了尝试看看它是否有效,但我没有得到我在结果中所追求的三列:

var test = OrderItemInfoProvider
                    .GetOrderItems()
                    .Source(orderItems => orderItems.Join<OrderInfo>("OrderItemOrderID", "OrderID"))
                    .Source(orders => orders.Join<CustomerInfo>("OrderCustomerID", "CustomerID"))
                    .Source(customers => customers.Join<UserInfo>("CustomerUserID", "UserID"))
                    .WhereEquals("OrderItemSKUID", 1013).Columns("FirstName", "LastName", "Email").Result;

我知道这绝对是错误的,我想知道实现这一目标的正确方法。也许在这里使用 ObjectQuery 不是正确的方法,或者我可以以某种方式只使用原始 SQL。我对 Kentico 的了解还不够,无法理解这里的最佳方法。

标签: kentico

解决方案


实际上,您创建的 ObjectQuery 是正确的。我对其进行了测试,它提供了正确的结果。您确定系统中确实有订单,其中包含 SKUID 1013 的产品(您可以在 COM_OrderItem 数据库表中查看)?

另外,您如何访问结果?遍历结果应如下所示:

    foreach (DataRow row in test.Tables[0].Rows)
    {
        string firstName = ValidationHelper.GetString(row["FirstName"], "");
        string lastName = ValidationHelper.GetString(row["LastName"], "");
        string email = ValidationHelper.GetString(row["Email"], "");
    }

推荐阅读