LINQ基于过滤子集返回集合的方法

时间:2012-07-10 05:34:25

标签: c# .net linq linq-to-sql

我有2张桌子。 1有实体,每行1。另一个是我的EntitiesID和EmployeeID的映射表。我正在尝试编写一个LINQ方法,该方法返回First Table中的所有实体,其中EntityID位于由EmployeeID过滤的映射表中。

简化的表结构示例 TaskTable: ID, Description, Status TaskViewTable: ID, TaskID, EmployeeID

所以我想从TaskTable返回所有行,其中ID是基于EmployeeID的TaskViewTable的SubQuery结果。

在LINQ中执行此操作有何帮助?我在两张桌子之间设置了1到多个。我知道有类似的问题我可能是密集的,但它们似乎并不完全适用于我的要求。(例如Linq Return Filtered Children

抱歉忘了展示我到目前为止的内容:

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

但是,它不喜欢我的where unkown method Where(?)

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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));

<强>更新

//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();
}