2012-07-10 99 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