在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%'
)
答案 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));
那只是该列表中的人。
感谢古斯蒂,你带领我走上了正确的道路。