2009-11-13 4 views
0

Предположим, у меня есть три таблицы:Как написать запрос linq на основе EF?

Person(pid, ...) 
PersonAddress(pid, aid,...) 
Address(aid, ...) 

Тогда я хочу, чтобы получить лицо адрес, как SQL:

select a.* from address a join PersonAddress pa on a.addressID=pa.addressID 
where pa.personID = myPersonID 

Использование Entity Framework для создания сущностей модели, то хочу написать Linq эквивалент, как указано выше SQL.

Я попробовал его в следующем виде:

var addresses = this.GetAddress(); 
     var personaddresses = this.GetPersonAddress(); 

     var query = from ad in addresses 
        from pa in personaddresses 
        where ((ad.AddressID == pa.AddressID)&&(pa.PersonID==person.personID)) 
        select ad; 

, но я получил сообщение об ошибке. Или я пытаюсь начать с:

var result = this.Context.Address; 
var result = result.Join .... //how to write linq in this way? 

Как написать linq?

ответ

1

Это непроверенное, но если у вас есть все ваши настройки отношений и создать модель (я использовал модель в качестве имени для этого) от этого вы должны быть в состоянии использовать следующее:

var values = this.Model.Address.Select(a => a.PersonAddress.Where(pa => pa.Id == myPersonID)); 
+0

спасибо. Попытаюсь. – KentZhou

+0

После попытки, нет ошибки. но при отладке для проверки результата он создает запись для каждого человека, при этом нет адреса. Он должен иметь только одну запись. Смущенный результатом – KentZhou

+0

, вы должны получать список адресов, а не людей из этого, разве это не то, что вам нужно? – bobwah

1

Вы почти никогда не используете join в LINQ to Entities.

Try:

var q = from p in Context.People 
     where p.PersonId == personId 
     from a in p.Addresses // presumes p.Addresses is 1..* 
     select a; 
1

Если у вас есть три сущности: Человек, PersonAddress и адресными, вот запрос, который должен удовлетворить ваши потребности (в этом примере предполагается, что в Entity Framework контекст с именем контекста):

var values = context.PersonAddress.Where(pa => pa.Person.PersonId == myPersonId).Select(pa => pa.Address); 

Однако, если таблица PersonAddress существует как чистая таблица отношений «многие-ко-многим» (то есть содержит только ключи), вам лучше настроить свою модель Entity Framework таким образом, чтобы промежуточная таблица не была необходимо, что оставило бы вас с гораздо проще эр:

var values = context.Person.Where(p => p.PersonId == myPersonId).Addresses; 

На основе дополнительной обратной

Поскольку вам необходимо включить таблицу страны, вы должны исходить запрос из таблицы адресов. В этом случае:

var values = context.Address.Where(a => a.PersonAddress.Where(pa => pa.Product.Id == myProductId).Count() > 0) 

Чтобы включить таблицу Страна в результате:

var values = context.Address.Include("Country").Where(a => a.PersonAddress.Where(pa => pa.Product.Id == myProductId).Count() > 0) 
+0

var values ​​= context.PersonAddress.Where (pa => pa.Person.PersonId == myPersonId) .Выберите (pa => pa.Address); Это работает, но как добавить include для этого запроса? например, есть поиск contry shoul, который будет включен в этот запрос – KentZhou

+0

См. альтернативный синтаксис выше ... – mkedobbs

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