我有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(?)
答案 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();
}