2017-07-24 75 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"));