2016-10-12 73 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,將返回一個列表對你要求員工和使用該名單。