Почему делает простой пустой указатель возврата отношений модели данных объекта вместо ссылки на объект?

Шаг 1: Создайте читаемые псевдонимы и переместите meta_key -предикаты в JOIN с

Я позволил себе отформатировать ваш запрос для ясности.

Я переименовал псевдонимы и переместил meta_key -предикаты из WHERE в JOIN с:

SELECT
    (SELECT meta_value
        FROM `myprefix_postmeta` as postmeta 
        WHERE 
            postmeta.meta_key = '_sku' 
            AND postmeta.post_id = IM3.meta_value ) AS sku,
    I.order_item_name AS title,
    SUM (IM.meta_value ) AS quantity,
    SUM (IM2.meta_value ) AS total
FROM 
    `myprefix_woocommerce_order_items` AS I
    LEFT JOIN `myprefix_posts` AS posts 
    ON posts.ID = I.order_id
    LEFT JOIN `myprefix_woocommerce_order_itemmeta` AS IM -- Make readable aliases
        ON IM.order_item_id = I.order_item_id 
            AND IM.meta_key = '_qty'   -- Move predicates from WHERE
    LEFT JOIN `myprefix_woocommerce_order_itemmeta` AS IM2 
        ON IM2.order_item_id =   I.order_item_id
            AND IM2.meta_key = '_line_total' -- Move predicates from WHERE
    LEFT JOIN `myprefix_woocommerce_order_itemmeta` AS IM3 
        ON IM3.order_item_id =   I.order_item_id
            AND IM3.meta_key = '_product_id' -- Move predicates from WHERE
WHERE 
    posts.post_type = 'shop_order'
    AND posts.post_status IN
    ( 'wc-completed', 'wc-processing', 'wc-on-hold' )
GROUP BY 
    IM3.meta_value
ORDER BY 
    total DESC

Теперь у нас есть абсолютно эквивалентный запрос.

Давайте посмотрим, что мы можем сделать дальше.

  1. 3 LEFT JOIN с myprefix_woocommerce_order_itemmeta с тем же предикатом IM.order_item_id = I.order_item_id выглядит ненужным дублированием
  2. Но у нас есть разные предикаты на meta_key

Step 2: Заменить 3 JOIN только одним, заменить JOINed-поля CASE-выражениями

Таким образом, мы можем:

a. Замените 3 СОЕДИНЕНИЯ только одним СОЕДИНЕНИЕМ

b. Замените поля IM / IM2 / IM3 CASE-выражениями

SELECT
    (SELECT meta_value
        FROM `myprefix_postmeta` as postmeta 
        WHERE 
            postmeta.meta_key = '_sku' 
            AND postmeta.post_id = ( -- Substitute meta_value with CASE-expressions 
                    CASE
                        WHEN IM.meta_key = '_product_id' THEN IM.meta_value
                        ELSE NULL
                    END 
                ) -- IM3.meta_value               
            ) AS sku,
    I.order_item_name AS title,
    SUM (
        CASE -- Substitute meta_value with CASE-expressions 
            WHEN IM.meta_key = '_qty' THEN IM.meta_value
            ELSE 0 
        END 
    ) AS quantity
    -- IM2.meta_value ) AS total
SUM ( -- Substitute meta_value with CASE-expressions 
    CASE
            WHEN IM.meta_key = '_line_total' THEN IM.meta_value
            ELSE 0
    END 
) AS total       

FROM 
    `myprefix_woocommerce_order_items` AS I
    LEFT JOIN `myprefix_posts` AS posts 
    ON posts.ID = I.order_id
    LEFT JOIN `myprefix_woocommerce_order_itemmeta` AS IM -- Make readable aliases
        ON IM.order_item_id = I.order_item_id 
            AND IM.meta_key IN ('_qty', '_line_total', '_product_id')
    --         AND IM.meta_key = '_qty'   -- Move predicates from WHERE
    -- LEFT JOIN `myprefix_woocommerce_order_itemmeta` AS IM2 
    --     ON IM2.order_item_id =   I.order_item_id
    --         AND IM2.meta_key = '_line_total' -- Move predicates from WHERE
    -- LEFT JOIN `myprefix_woocommerce_order_itemmeta` AS IM3 
    --     ON IM3.order_item_id =   I.order_item_id
    --         AND IM3.meta_key = '_product_id' -- Move predicates from WHERE
WHERE 
    posts.post_type = 'shop_order'
    AND posts.post_status IN
    ( 'wc-completed', 'wc-processing', 'wc-on-hold' )
GROUP BY 
    (
        CASE
            WHEN IM.meta_key = '_product_id' THEN IM.meta_value
            ELSE NULL
        END 
    ) -- IM3.meta_value    
ORDER BY 
    total DESC

PS

Не очень удобно писать SQL без данных.

И возможно, что этот запрос некорректен для каждой версии mysql.

Поэтому постарайтесь понять принципы, а не просто скопировать и вставить мой код.

Сообщите нам о результатах или проблемах.

7
задан 7 revs 16 February 2009 в 07:52
поделиться

3 ответа

Необходимо добавить.Include метод к запросу.

var _db = new MyDBEntities();
var product = (from p in _db.Product.Include("Company")
               where p.ProductID == 3
               select p).First();
11
ответ дан 6 December 2019 в 10:54
поделиться

Deeploading поддерживается платформой Объекта, но ленивая загрузка не (ленивая загрузка будет поддерживаться в платформе Объекта 2.0).

С Загрузкой () или.Include ("Компания") как предыдущие сообщения говорят, что это будет работать.

Вот walkthough, как можно сделать платформу объекта ленивой: http://blogs.msdn.com/jkowalski/archive/2008/05/12/transparent-lazy-loading-for-entity-framework-part-1.aspx

6
ответ дан 6 December 2019 в 10:54
поделиться

Можно использовать, Включают, как предложено выше.

Кроме того, попытайтесь звонить

продукт. Компания. Загрузка () для получения объекта.

Использование Платформы Объекта задержало загрузку для предотвращения ненужных запросов, пока объект на самом деле не требуется..

Существует еще некоторая информация о задержанной загрузке здесь: http://www.code-magazine.com/article.aspx?quickid=0711051&page=4

1
ответ дан 6 December 2019 в 10:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: