我有以下设置:任务,帐户和组表。可以将任务分配给个人帐户和组。我已经制作了两个支持表:TasksAndAccounts和AccountsInGroups。 TasksAndAccounts表具有以下字段:TaskId,AccountId,GroupId和AccountsInGroups具有AccountId和GroupId字段。我正在尝试编写一个查询,该查询将返回分配给给定帐户ID的所有任务。这里的罪魁祸首是查询应首先在TasksAndAccounts表中查看是否存在与给定帐户直接相关的任务,然后还要查找与给定帐户关联的任何组。
基本算法很简单:
我试图以几种不同的方式解决这个问题,但未能取得任何令人满意的结果。
关于编写优雅的单一查询解决方案的任何想法?
答案 0 :(得分:1)
唉。看起来你需要一个子选择。
var ids = from task in context.TaskAndAccounts
where task.AccountId == accountId ||
(from grp in context.AccountsInGroups
where grp.AccountId == accountId
select grp.GroupId).Contains(task.GroupId)
select task;
答案 1 :(得分:1)
这应该转换为EXISTS子查询:
var tasks = from task in dc.TasksAndAccounts
where task.AccountId == accountId || (
from g in dc.AccountsInGroups
where g.AccountId == accountId && g.GroupId == task.GroupId
select g.GroupId
).Any()
select task;
答案 2 :(得分:1)
就个人而言,我会这样做:
var tasks = db.TasksAndAccounts.Where(x => x.AccountId == accountId);
var groups = db.AccountsInGroups.Where(x => x.AccountId == accountId);
var groupIDs = groups.Select(x => x.GroupId);
var groupTasks = db.TasksAndAccounts.Where(x => groupIDs.Contains(x.GroupId));
var allTasks = tasks.Union(groupTasks);
这不止一条线,但在我看来,它比把整个东西塞进一条线要清楚得多。由于LINQ使用延迟执行,因此在实际使用 allTasks结果集之前,您仍然不会执行任何操作。
答案 3 :(得分:0)
应该是这样的:
var tasks = from taa in TasksAndAccounts.Where(t => t.AccountId == accountId)
join aig in AccountsInGroups.Where(a => a.AccountId == accountId) on taa.GroupId equals aig.GroupId
select taa;