2009-11-13 45 views
0

假設我有三個表:如何編寫基於EF的linq查詢?

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 

使用實體框架創建實體模型,然後想寫一個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 2009-11-13 19:53:41

+0

嘗試過之後,沒有錯誤。但是當爲結果檢查進行調試時,它會爲每個人創建一個記錄,在此之下,沒有地址。它應該只有一個記錄。結果 – KentZhou 2009-11-13 20:36:41

+0

你應該得到一個地址列表,而不是從這個人的列表,這是不是你以後? – bobwah 2009-11-13 21:46:57

1

您幾乎從不在LINQ to Entities中使用join

嘗試:

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和地址,這裏是一個應該滿足您的需求(此示例假設一個名爲上下文實體框架上下文)的查詢:

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

但是,如果PersonAddress表存在一個純多對多關係表(即只包含關鍵字),那麼最好是以這樣一種方式設置實體框架模型,即中間表不是必要的,這會讓你很簡單ER:

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).Select(pa => pa.Address);這工作,但如何添加此查詢包括?例如,查詢包含在此查詢中的條目 – KentZhou 2009-11-13 20:34:58

+0

請參閱上面的替代語法...... – mkedobbs 2009-11-13 22:12:42