我有一个通用的员工列表,使用WCF Web服务获取,以及带有费用报告的SQL表。我有一个带有费用报告列表的索引页面,我想在列表中显示员工姓名,但员工姓名不存储在费用报表中,只存储在员工ID中。通常,我会使用员工和费用报表之间的联接,但我发现我无法将内存数据集(员工)加入SQL数据库调用(费用报表)。我得到一个关于原始类型的错误。
看起来我唯一的选择是先让所有员工,然后遍历费用报告以找到匹配的员工ID,或者首先获取所有费用报告并迭代它们并获取员工信息。问题是,在某些情况下,我可能在等式的每一边有数千行。做任何一种都是非常低效的。
所以我的问题是,我是否遗漏了某些东西,是否有办法有效地将内存数据集连接到SQL数据库调用,或者是我唯一的选择来反规范化我的数据库并将信息存储在SQL表中? / p>
答案 0 :(得分:0)
如果您实际提供了一些代码,那么这将更容易 。但是,您只需要通过类似id列表查询,而不是查询完整的员工对象。有点像:
var employeeIds = employees.Select(m => m.Id).ToList();
var expenses = db.Expenses.Where(m => employeeIds.Contains(m.EmployeeId));
同样,没有代码可以使用,因此您显然需要将其调整为您的实际类和属性名称。
答案 1 :(得分:0)
如你所说,可能有数千条记录,所以你会有某种分页?我首先从数据库中提取记录,然后对员工列表进行查询。如果你在DB的结果后面放了一个.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服务,以接受员工ID列表,该列表将返回您要求并使用该员工的员工列表。