2009-02-20 3 views
3

Я только начинаю с LINQ to Entities, и я пытаюсь реплицировать поиск, который мы сейчас делаем в хранимой процедуре, как запрос LINQ to Entities. Тем не менее, я не могу представить правильный способ запроса свойств объектов более одного «соединения» от начальной точки моего запроса.Как перемещаться по нескольким отношениям с помощью LINQ to Entities?

Например, скажем, у меня есть таблица Кампания, Местоположение Кампании и Местоположение, у которых есть внешние ключи от Кампании до Кампании, а также CampaignLocation to Location. Довольно стандартная конфигурация таблицы «многие-ко-многим». Когда я начинаю писать свой запрос LINQ следующим образом:

var campaigns = from c in context.Campaign.CampaignLocation 

Это как можно дальше в цепи ассоциации, как я могу. Кажется, что нет свойства «Местоположение» в «CampaignLocation», чтобы я мог фильтровать свойства Location.

Я попытался с помощью LINQ синтаксис объединения, как это:

var campaigns = from c in context.Campaign 
       join cl in context.CampaignLocation 
        on c.CampaignID equals cl.CampaignID 

Но не похоже, чтобы быть собственностью «CampaignID» на «CL» псевдоним. Что действительно странно, есть столбец с именем, который находится на столе. Разве это не на объекте модели, поскольку это внешний ключ в таблице кампании?

Где я здесь не так, и чего мне не хватает?

[UPDATE]

Похоже, любое целое число столбцов, которые я использую для внешних ключей не будут добавляться в качестве свойств модельных объектов. Отображаются отношения внешнего ключа, но свойств идентификатора нет. Есть ли способ заставить конструктора добавлять эти свойства к модели, когда я читаю схему из базы данных?

+0

Я не знаю, как предотвратить его использование в качестве свойств навигации, я сделаю некоторые тесты и исследования и посмотрю, смогу ли я дать ответ. –

+0

Даже если бы я мог понять, как использовать свойства навигации для перемещения до «Местоположение», со мной все будет в порядке. Я по-прежнему чувствую, что здесь отсутствует большая часть картины. –

ответ

1

Это свойство является ссылкой на сущность самой таблицы, есть ли у вас отношение местоположения, определенное в вашей модели EF для списка кампаний. < -> Местоположение? Затем, в зависимости от того, что вы на самом деле пытаетесь сделать (join и т. Д.), Я хотел бы использовать синтаксис linq join, linq-вложенный запрос (может сформировать соединение) или просто использовать proc, который вы изначально имели. Если бы была цель иметь прок в первую очередь, просто потяните это в свою модель EF.

Edit для обновления:

Попробуйте открыть модель и освежающие из БД для этих таблиц, столбцы должны быть там, они могут быть удалены вручную, однако. Даже при наличии столбцов вам все равно придется определять отношения самостоятельно внутри EFModel.

0

Эти работы?

Campaign campaign1 = context.Campaigns.Where(x => x.CampaignID == 1).Single(); 
    foreach (CampaignLocation campaignlocation in campaign1.CampaignLocations) 
    { 
     Response.Write(campaignlocation.Location.Name + "<br />"); 
    } 

    Location location1 = context.Locations.Where(x => x.LocationID == 3).Single(); 
    foreach (CampaignLocation campaignlocation in location1.CampaignLocations) 
    { 
     Response.Write(campaignlocation.Campaign.Name + "<br />"); 
    } 

(я подозреваю, что вам не хватает либо внешний ключ или ссылку на объект ...)

0

Альтернативный ответ - Вам необходимо вручную отредактировать/обновить файл EDMX-если вы имеете изменила базу данных с момента ее создания?

+0

EF не работает на dbml, это edmx. Модель linq to sql не совпадает с моделью EF. –

+0

Петух. Я неправильно понял вопрос. Теория должна по-прежнему применяться, хотя ... – ctrlalt3nd

+0

Wow способ справиться с конструктивной критикой! Однако по сути ответа ... ну, я полностью согласен, и поэтому я тоже предложил это! (Обновить EF-модель от БД) –

Смежные вопросы