MVC / Entity框架CORE搜索链接模型的数据

时间:2017-07-24 16:19:45

标签: entity-framework

在Contoso大学教程之后,我有一个Person类,它链接到Address类以提供一对多的关系

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"));

从数据库中恢复所有“史密斯”。如何扩展它以便我只搜索那些带有特定邮政编码的记录?

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

这不起作用,因为Postcode位于连接的Address模型中,而不是Person模型

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

这不起作用,因为某些东西是对象引用(我认为),如Add,Aggregate&lt;&gt;,All&lt;&gt;等。

我是否应该使用LINQ将这两者结合在一起(尽管我认为它们已经通过EF连接在一起)? 感谢

修改 使用下面的答案,我得到了一个PersonIDs列表,其中包含我正在搜索的邮政编码

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

现在我需要沿着这些行执行SQL IN命令

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

这不起作用,因为 “int不包含contains

的定义

实际上,这是我正在尝试检索的数据的SQL

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

2 个答案:

答案 0 :(得分:0)

尝试:

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

答案 1 :(得分: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));

那只是该列表中的人。

感谢古斯蒂,你带领我走上了正确的道路。