2016-10-12 2 views
0

У меня есть общий список сотрудников, выбранных с использованием веб-службы WCF и таблицы SQL с отчетами о расходах. У меня есть индексная страница со списком отчетов о расходах, и я хочу отобразить имя сотрудника в списке, но имя сотрудника не сохраняется в таблице отчетов о расходах, а только идентификатор сотрудника. Обычно я хотел бы использовать соединение между сотрудниками и отчетами о расходах, но я обнаружил, что не могу присоединиться к набору данных (сотрудникам) в памяти к вызову базы данных SQL (отчеты о расходах). Я получаю ошибку о примитивных типах.Список фильтров из базы данных с использованием списка в памяти

Оказалось, что мой единственный вариант - либо сначала получить всех сотрудников, либо затем перечислить отчеты о расходах, чтобы найти соответствующие идентификаторы сотрудников, либо сначала получить все отчеты о расходах, а также пропустить их и получить информацию о сотрудниках. Проблема в том, что в некоторых случаях у меня могут быть тысячи строк в каждой части уравнения. Выполнение либо было бы крайне неэффективным.

Итак, мой вопрос: я что-то упускаю, и есть способ эффективно объединить набор данных в памяти с вызовом базы данных SQL или мой единственный вариант денормализации моей базы данных и хранения информации в таблице SQL?

+0

Вы используете первый подход к базе данных? или код сначала с картой сущностей? –

ответ

0

Это будет много проще, если вы действительно предоставили некоторый код для работы. Однако вам просто нужно запросить что-то вроде списка идентификаторов, а не полных объектов-сотрудников. Что-то вдоль линий:

var employeeIds = employees.Select(m => m.Id).ToList(); 
var expenses = db.Expenses.Where(m => employeeIds.Contains(m.EmployeeId)); 

Опять же, код не работать, так что вы, очевидно, нужно адаптировать, что ваши фактические имена классов и свойств.

0

Как вы упомянули, возможно, тысячи записей, поэтому у вас будет какой-то пейджинг? Сначала я вытащил записи из БД, затем выполнил запрос к списку сотрудников. Если вы поместите результат .ToList() за свой результат из БД, тогда он выполнит SQL, который получит результат и будет загружен в memeory. То есть, если вы используете инфраструктуру ORM как сущность или linq для sql.

var itemsPage = 50; 
var expensesPage = expenses 
    .Skip(itemsPage * pageNumber) 
    .Take(itemsPage) 
    .ToList(); 

var result = expensesPage 
    .Join(employees, 
    exp => exp.EmployeeId, 
    emp => emp.Id, 
    (expense, employee) => new ExpenseViewModel { employee.Name, expense.Expenses } 
); 

Если там тысячи сотрудников тоже, то я бы изменить к WCF службы также принимает список идентификаторов через сотрудника, который будет возвращать список над сотрудниками вы просили и использовать это.

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