2014-02-13 5 views
0

У меня есть список cids что я забирающий как этотсравнения списка с помощью LINQ

var cids = _service.Employee.Where(i => i.EmpID == _empID).Select(j => j.ClientID).ToList(); 

Я хочу, чтобы сравнить этот список с Patient Entity и получить все записи пациентов, которая соответствует ClientId в cid list

Entity Пациент как этот

class Patient 
{ 
    Int PatientID{ get; set;} 
    Int ClientID{get; set;} 
    string PatientName{get; set;} 
} 

Прямо сейчас я делаю это, как этот

foreach(var item in cids) 
{ 
    var pp = from p1 in _service.Patients 
          where p1.ClientId == item 
          select new PatientDTO 
          { 
           PatientID = p1.PatientID, 
           PatientName = p1.PatientName, 

          }; 
    prec.Add(pp); 
} 

Есть ли способ сделать это с Linq без использования foreach

ответ

3

Вы можете использовать Contains на свой список (вам не нужно ToList, кстати: это позволило бы избежать 2 запросов на БД).

var allPp = _service.Patients.Where(p1 => cids.Contains(p1.ClientId)) 
          .Select(m >= new PatientDTO) { 
            PatientID = m.PatientID, 
           PatientName = m.PatientName 
          }); 

Но самый производительный способ, в мире дб, был бы присоединиться к

from emp in _service.Employee.Where(i => i.EmpID == _empID) 
join patient in _service.Patients on emp.ClientId equals patient.ClientId 
select new PatientDTO { 
    PatientID = patient.PatientID, 
    PatientName = patient.PatientName, 
} 
+0

Не могли бы вы объяснить нижний план? –

+0

+1. Я не понимаю, почему этот ответ получил отрицательный голос. Этот ответ непосредственно отвечает на запрос: цикл foreach был переписан как «Where», а остальная часть осталась нетронутой. Разумеется, «Интерсект» будет (часто, не всегда) лучше, но эй, этот ответ имеет 100% -ную точность для фактического вопроса. – quetzalcoatl

+0

@ RaphaëlAlthaus Спасибо, ваш первый запрос отлично работает. Я получаю эту ошибку с вашим вторым запросом '" Тип одного из выражений в предложении соединения неверен. Ошибка ввода типа в вызове Join "' Можете ли вы помочь – ElectricRouge

3

Использования Enumberable.Intersect для извлечения общих записей.

var commonClients = cids.Intersect<int>(_service.Patients.Select(x => x.ClientID)); 

var person = _service.Patients.Where(x => commonClients.Contains(x.ClientID)); 
+0

это IQueryable, не IEnumerable ... –

+2

Обеспечивая пример, а не ссылка будет предпочтительную , –

Смежные вопросы