2017-07-24 128 views
0

繼Contoso大學教程搜索,我有哪些鏈接到地址類Person類給予一個一對多的關係MVC /實體架構核心,通過鏈接模型的數據

public class Person{ 
    public string FullName { get; set; } 
    public virtual ICollection<Address> AddressIDs { get; set; } 
} 

public class Address { 
    public string Postcode { get; set; } 
    [ForeignKey("PersonID")] 
    [Display(Name = "Person ID")] 
    public int? PersonID { get; set; } 
    public virtual Person objPerson { get; set; } 
} 

所以我的觀點顯示了所有這樣的人的地址,這一切都正常工作,對於一個人我得到他們所有地址的列表。

@foreach (var item in Model.AddressIDs) { 
    @Html.DisplayFor(modelItem => item.Address1) 
    @Html.DisplayFor(modelItem => item.Address2) 
    @Html.DisplayFor(modelItem => item.Postcode) 

在控制器我用

var persons = from ps in _context.FullPerson 
select ps; 
persons = persons.Where(ps => ps.objPerson.Forename.Contains("Smith")); 

從數據庫帶回所有的 「史密斯」 S。我怎樣才能擴展這個,這樣我就可以只搜索那些帶有某個郵編的記錄?

persons = persons.Where(ps => ps.objPerson.Postcode.Contains("SW9"));. 

這不起作用,因爲郵政編碼是在連接的地址模式,對事不對人模型

persons = persons.Where(ps => ps.objPerson.AddressIDs.something.Contains("SW9")); 

這並不是因爲什麼工作的對象引用(我認爲),如添加,總計<>,所有<>等

我是否應該使用LINQ將這兩者連接在一起(即使我認爲它們已經通過EF連接在一起)? 感謝

編輯 使用回答以下我得到的郵政編碼我在尋找

IQueryable<int> PersonIDsWithThisPostcode = _context.Addresses.Where(pst => pst.Postcode.Contains(p)).Select(b => b.PersonID); 

的PersonIDs列表現在我需要繼續沿着這條做一個SQL命令

persons = persons.Where(ps => ps.HumanID.Contains(PersonIDsWithThisPostcode)); 

這不起作用,因爲 「詮釋不包含一個定義包含」

實際上,這是對數據的SQL我試圖找回

SELECT * FROM person 
WHERE personid IN(
    SELECT personid FROM address 
    WHERE postcode LIKE 'sw%' 
) 

回答

0

因此,即使一切都是通過模型和實體框架的聯繫,我我仍然需要編寫LINQ來獲得鏈接的兩件事情。

IQueryable<int> PersonIDsWithThisPostcode = _context.Addresses.Where(pst => pst.Postcode.Contains(p)).Select(b => b.PersonID); 

這會激發所有的人通過郵政編碼我在尋找

persons = persons.Where(ps => PersonIDsWithThisPostcode.Contains(ps.PersonID)); 

那得到的唯一的人在該列表中。

謝謝古斯蒂,你讓我走下了正確的道路。

0

嘗試:

var addresses= from adr in _context.Address 
select adr; 
addresses= addresses.Where(adr => adr.PostCode.Contains("zipCode") && 
adr.objPerson.Forename.Contains("Smith"));