2012-07-10 96 views
0

我有2個表。 1有實體,每行1個。另一個只是我的EntitiesID和EmployeeID的映射表。我正在嘗試編寫一個LINQ方法,該方法返回第一個表中EntityID位於由EmployeeID過濾的映射表中的所有實體。LINQ基於過濾子集返回集的方法

簡表結構示例 TaskTable: ID, Description, Status TaskViewTable: ID, TaskID, EmployeeID

所以我想從TaskTable返回的所有行ID是基於僱員TaskViewTable的子查詢結果。

在LINQ中做這件事的任何幫助?我也在兩張桌子之間設置了1到多個。我知道有類似的問題是,也許我密,但他們似乎並不完全適用於我問什麼(例如Linq Return Filtered Children

對不起忘記展示一下我到目前爲止:

IQueryable<tblTask> tTask=context.GetTable<tblTask>(); 
return tTask.Where(t => t.tblTasksViews.Where(v => v.EmployeeID == empID)) 

然而,它不喜歡我whereunkown method Where(?)

回答

1

像這樣的東西應該做的伎倆:

var tasks = tTask.Where(t => 
    tTaskView.Where(v => v.ID == empId).Select(v => v.TaskId).Contains(t.ID)); 

你可以打破上述分爲兩個部分:

//1.) Get all task views for the employeeID and only select the mapped TaskId 
var taskViews = tTaskView.Where(v => v.ID == empId).Select(v => v.TaskId); //taskViews = IEnumerable<int> 

//2.) Then get all tasks from the filtered task ids 
var tasks = tTask.Where(t => taskViews.Contains(t.ID)); 

UPDATE

//3.) Project filtered results into IEnumerable<Task> 
return tasks.Select(t => new Task() 
{ 
    ID = t.ID, 
    ActionableID = t.ActionableID, 
    StatusID = t.StatusID, 
    TypeID = t.TypeID, 
    Description = t.Description 
}); 

你可以,當然,串一切都變成漂亮單行:

public List<Task> GetTasks(int empId) 
{ 
    return tTask 
     .Where(t => tTaskView.Where(v => v.ID == empId).Select(v => v.TaskId).Contains(t.ID)) 
     .Select(t => new Task() 
     { 
      ID = t.ID, 
      ActionableID = t.ActionableID, 
      StatusID = t.StatusID, 
      TypeID = t.TypeID, 
      Description = t.Description 
     }).ToList(); 
} 
+0

在教育方面有什麼價值可以分解嗎?非常感謝你的答案 – 2012-07-10 06:30:00

+0

沒有,就我所知,沒有任何功能價值,打破它通常只是更容易閱讀和理解,我更喜歡單行,但是, – tobias86 2012-07-10 06:33:37

+0

好的,上次澄清。我如何指定我想要選擇的字段?即我有一個任務對象,我想創建並填充這個,通常我做這樣的事情。選擇(t =>新任務(){ ID = t.ID, ActionableID = t.ActionableID, StatusID = t.StatusID, TYPEID = t.TypeID, 說明= t.Description, })' – 2012-07-10 06:42:40

1

嘗試是這樣的:

var query = 
    from tt in TaskTable 
    join tvt in TaskViewTable on tt.ID equals tvt.TaskID into xs 
    where xs.Any(z => z.EmployeeID == empID) 
    select tt; 
+0

EmpID是如何進入這個的。這是晚了,我可能是密集的,但我不需要在TaskViewTable的'tvt.EmpID == EmpID'(傳入參數? – 2012-07-10 05:53:18

+0

例如也許這'其中xs.Any(z => z.EmployeeID == empid)''會完成我想要的嗎? – 2012-07-10 06:02:52

+0

從你對錶格的描述看來,它聽起來不像你的表格中的'EmployeeID'。然而,你對我的'.Any()'調用的改變是正確的我會編輯我的答案 – Enigmativity 2012-07-10 12:23:27