Kentico 10 ObjectQuery联接多个表

时间:2019-03-25 23:47:16

标签: kentico

我基本上是在尝试运行一个查询,该查询向我提供所有购买了具有特定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尝试实现这一目标,但不知道如何实现。 here文档未涵盖我要查找的特定类型的场景。我想出了这个方法只是想看看它是否有效,但是在结果中我没有得到我要关注的三列:

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的了解不足,无法了解这里的最佳方法。

1 个答案:

答案 0 :(得分:2)

实际上,您创建的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"], "");
    }