Как написать запрос linq на основе EF? - PullRequest
0 голосов
/ 13 ноября 2009

Предположим, у меня есть три таблицы:

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 для создания модели Entity, затем хотите написать эквивалент linq, как указано выше.

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

 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?

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

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

var values = this.Model.Address.Select(a => a.PersonAddress.Where(pa => pa.Id == myPersonID));
1 голос
/ 13 ноября 2009

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

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)
1 голос
/ 13 ноября 2009

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

Попробуйте:

var q = from p in Context.People
        where p.PersonId == personId
        from a in p.Addresses // presumes p.Addresses is 1..*
        select a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...