我有一个网站,我有一个人员数据库,每个人可以有多个利益,通过人员表和兴趣表之间的一对多关系来处理。在网站上我想要一个serach,你可以有一个多选择的兴趣框,用户可以选择他们想要的任意数量。我想要返回的是所有选定选项中包含任何兴趣的人的记录集。我的代码是C#asp.net,到目前为止看起来像这样:
personResults = (from p in data.Persons
orderby p.lastName, p.firstName
select p);
我想添加这样的东西虽然我知道下面代码中的最后一行完全是假的。假设兴趣是我的多选框ID。
List<int> interestIdList = new List<int>();
if (interest.GetSelectedIndices().Length > 0) {
foreach(int selectedIndex in interest.GetSelectedIndices()){
interestIdList.Add(int.Parse(interest.Items[selectedIndex].Value));
}
personResults = personResults.Where(x => interestIdList.Contains(x.Interests[].interestID));
}
问题在于最后一行代码。因为x.Interests是数据库之外的感兴趣对象的集合,所以我无法访问他们的兴趣ID(如果一个人有5个兴趣,那么现在代码如何获取感兴趣的项ID)。如果它可以帮助我使用我感兴趣的ID列表来构建感兴趣的对象列表,但我仍然无法弄清楚如何构建查询。
再次说明我的目标,我希望任何有兴趣的人都在interestIdList数组中。它们并非都必须匹配;只要我想要记录至少有一个共同的值。
答案 0 :(得分:1)
如果在DBML中设置了从person表到“personsWithInterests”表到兴趣表的适当关系,你可以试试这个:
ArrayList ids = new ArrayList();
foreach (int index in interest.GetSelectedIndices())
{
ids.Add(interest.Items[index].Value);
}
string[] idArray = (string[])ids.ToArray(typeof(string));
var personsWithInterests = (from pi in data.PersonInterests where idArray.Contains(pi.Interest.Id.ToString()) select pi.Person).Distinct();