2016-10-12 43 views
0

我有一个雇员的通用列表,使用WCF Web服务获取,以及一个包含费用报表的SQL表。我有一个包含费用报告列表的索引页,我想在列表中显示员工姓名,但员工姓名并未存储在费用报告表中,而仅存储在员工ID中。通常,我会在员工和费用报告之间使用连接,但我发现我无法将内存数据集(员工)加入SQL数据库调用(费用报告)。我收到关于原始类型的错误。使用内存列表从数据库中过滤列表

看来我唯一的选择是首先让所有员工获得,然后遍历费用报表以查找匹配的员工ID,或者先获取所有费用报告并遍历他们并获取员工信息。问题是,在某些情况下,我可能在方程的每一边有数千行。做任何一个都会非常低效。

所以我的问题是,我是否错过了一些东西,有没有办法将内存数据集有效地加入到SQL数据库调用中,还是我将数据库非规范化并将信息存储在SQL表中的唯一选项?

+0

您是否使用数据库优先方法?或首先使用实体​​框架的代码? –

回答

0

这将是如果您实际提供了一些代码来处理更容易。但是,您只需通过诸如ID列表之类的内容进行查询,而不是完整的员工对象。沿着线的东西:

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服务,也接受了员工ID,将返回一个列表对你要求员工和使用该名单。