Entity Framework включает в себя, где с 3 таблицами - PullRequest
4 голосов
/ 03 октября 2009

Я пытаюсь включить две таблицы из одной базовой таблицы и предоставить инструкцию "где" для второй таблицы, но я получаю очень запутанную ошибку (ниже). Есть мысли по поводу вопроса / решения?

ObjectQuery<STATE> productQuery = 
    LeadsContext.STATE.Include("REGION")
      .Where("it.REGION.BRAND.BRAND_ID = @brand", new ObjectParameter("brand", brand))
      .OrderBy("it.STATE_ABBV");

Базовая раскладка таблицы: STATE ------ REGION ------ BRAND

BRAND_ID в BRAND

'BRAND' не является членом 'Transient.collection [Citizens.Leads.Data.REGION (Nullable = True, DefaultValue =)]'. Чтобы извлечь свойства из коллекций, вы должны использовать подзапрос в итерация по коллекции. рядом с многочастным идентификатором, строка 8, столбец 1.

Ответы [ 2 ]

6 голосов
/ 23 ноября 2009

Алекс, вы можете достичь чего-то похожего в построителе запросов, подходя к запросу по-другому. Поддержка построителя запросов существует. Запрос будет выглядеть примерно так:

 ObjectQuery productQuery = 
        LeadsContext.STATE.Include("REGION")
          .Where("EXISTS(SELECT 1 FROM it.REGION.BRAND as b WHERE b.BRAND_ID
= @brand)", new ObjectParameter("brand", brand))
          .OrderBy("it.STATE_ABBV");

6 голосов
/ 03 октября 2009

Звучит так, как будто State.REGION на самом деле представляет собой совокупность Region сущностей.

В этом случае вы не можете просто получить прямой доступ к навигации BRAND, поскольку ваш оператор пытается получить доступ к свойству BRAND коллекции, а не к свойству BRAND элемента в коллекции.

Если вы пишете этот запрос, используя LINQ to Entities, а не методы построителя запросов, вы можете сделать это следующим образом:

var productQuery = from s in LeadsContext.State
                   from r in s.REGION
                   where r.Brand.Brand_ID == brand
                   orderby s.STATE_ABBR
                   select s;

Конечно, это не будет охотно загружать REGION (s), так что вы можете подумать, что могли бы написать это:

var productQuery = from s in LeadsContext.State.Include("REGION")
                   from r in s.REGION
                   where r.Brand.Brand_ID == brand
                   orderby s.STATE_ABBR
                   select s;

Но это не сработает, потому что ваш ВКЛЮЧЕНО теряется, когда вы делаете «Выбрать много» (т.е. from y in z from x in y).

Таким образом, вы должны выполнить «Включить в конце» следующим образом:

var productQuery = (from s in LeadsContext.State
                   from r in s.REGION
                   where r.Brand.Brand_ID == brand
                   orderby s.STATE_ABBR
                   select s) as ObjectQuery<State>).Include("REGION");

См. tip 22 * ​​1020 * для получения дополнительной информации об этом обходном пути.

Я не уверен на 100%, что наши методы построения запросов, то есть где (строка), поддерживают подвыборы, что и требуется.

Так что я не уверен, какой там будет синтаксис.

В любом случае, я надеюсь, что это поможет

Alex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...