【发布时间】:2016-06-30 14:36:04
【问题描述】:
我有一个用于搜索名为“Patients”的 EF 对象的 Web API 方法。患者有一个名为 Referrals 的导航属性(一个患者可以有多个转介),每个 Referral 都有一个名为“ConsultantID”的整数属性。
我想返回所有有转诊的患者,其 ConsultantID 值在名为“顾问”的定义数组内,但我无法理解所需的逻辑。我目前有以下内容,但它没有像我预期的那样工作,推荐人。任何调用似乎都在执行“存在”调用,而不是我期望的加入行为。
public List<HelperCode.DTO.SearchResult> SearchPatients(string firstname, string surname, [FromUri] int[] consultants)
{
IQueryable<Patient> results = db.Patients;
List<HelperCode.DTO.SearchResult> output = new List<HelperCode.DTO.SearchResult>();
List<int> inputConsultants = consultants.OfType<int>().ToList();
if (!String.IsNullOrEmpty(firstname)) { results = db.Patients.Where(c => c.FirstName.ToLower().Contains(firstname.ToLower())); }
if (!String.IsNullOrEmpty(surname)) { results = results.Where(c => c.Surname.ToLower().Contains(surname.ToLower())); }
if (consultants.Length > 0) {
results = results.Where(c => c.Referrals.Any(r => inputConsultants.Contains(r.ConsultantID ?? default(int))));
}
results = results.OrderBy(i => i.Surname);
foreach (Patient p in results) {
output.Add(new HelperCode.DTO.SearchResult(p));
}
return output;
}
【问题讨论】:
-
这行
consultants.OfType<int>().ToList()的目的是什么? -
为什么要关心 SQL 查询是使用
EXISTS还是JOIN?你得到正确的结果吗?如果有,有什么问题? -
@Ric 纯粹是把consults数组转换成一个列表,方便以后调用.Contains方法。
-
但是你采用一个 int 数组,过滤元素只返回 int,然后调用
ToList().... -
@IvanStoev 我不在乎。它似乎限制了结果集。如果我将数组中的单个顾问 ID 值传递给它,它会返回 220 个结果,但如果我传入相同的 ID 和另一个 3 个顾问 ID,它只返回 28 - 我希望它返回任何具有顾问 ID 的推荐结果数组,所以会期望更多而不是更少的结果。
标签: c# entity-framework linq navigation-properties