一个繁琐的linq查询

时间:2009-10-10 01:03:21

标签: c# linq

我有以下设置:任务,帐户和组表。可以将任务分配给个人帐户和组。我已经制作了两个支持表:TasksAndAccounts和AccountsInGroups。 TasksAndAccounts表具有以下字段:TaskId,AccountId,GroupId和AccountsInGroups具有AccountId和GroupId字段。我正在尝试编写一个查询,该查询将返回分配给给定帐户ID的所有任务。这里的罪魁祸首是查询应首先在TasksAndAccounts表中查看是否存在与给定帐户直接相关的任务,然后还要查找与给定帐户关联的任何组。

基本算法很简单:

  1. 从TasksAndAccounts获取所有任务,其中TasksAndAccounts.AccountId == accountId
  2. 从AccountsInGroups获取所有组,其中AccountsInGroups.AccountId == accountId
  3. 从TasksAndAccounts获取所有任务,其中TasksAndAccounts.GroupId位于步骤2的结果集中。
  4. 合并步骤1和3。
  5. 我试图以几种不同的方式解决这个问题,但未能取得任何令人满意的结果。

    关于编写优雅的单一查询解决方案的任何想法?

4 个答案:

答案 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使用延迟执行,因此在实际使用 allTask​​s结果集之前,您仍然不会执行任何操作。

答案 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;