0

我认为可以将循环中的多个 linq 查询保存在单个变量中吗?

public ActionResult Index()
    {
        string ActiveUserId = (string)Session["ActiveUserGuid"];
        Guid MyGuid = new Guid(ActiveUserId);

        var queryRoots = from r in db.Roots
                         where r.UserId == MyGuid
                         select r.TaskId;

//Here is the questionable Part
        foreach (var i in queryRoots)
        {             
            var queryAllTasks = from t in db.Tasks
                                join b in db.Trees on t.TaskId equals b.ChildId
                                where b.TaskId == i
                                select t;
            tasksForView.Add(queryAllTasks); <---????? obviously doesnt work
        };

        return View(queryAllTasks);
    }

public class Root
{
    public int RootId { get; set; }

    public Guid UserId { get; set; }
    public User User { get; set; }  //navigation Property

    public int TaskId { get; set; } // composite key
    public int ChildId { get; set; }
    public Tree Tree { get; set; } //navigation Property
}

public class Tree
{
    public int TaskId { get; set; }
    public int ChildId { get; set; }
    public int Length { get; set; } //Path length

    public virtual ICollection<Root> Roots { get; set; }

}

如果您想知道它应该做什么。我想从分层传递闭包表中查询几个子树并将它们返回到视图。

我知道我的代码还没有接近工作,我只是尝试了非常简单的解决方案!我想一种不同的查询方式可以一起解决这个问题

4

3 回答 3

2

Contains在您的整数列表中使用:

var tasks = 
    from t in db.Tasks
    join b in db.Trees on t.TaskId equals b.ChildId
    where queryRoots.Contains(b.TaskId)
    select t;

return View(tasks);

或在一个查询中完成所有操作:

var tasks = 
    from t in db.Tasks
    join b in db.Trees on t.TaskId equals b.ChildId
    join r in db.Roots on r.TaskId equals b.TaskId
    where r.UserId == MyGuid
    select t;

return View(tasks);
于 2012-10-04T18:32:03.817 回答
0

这里的问题是您正在关闭循环变量。LINQ 查询尽可能使用延迟执行,因此您只是定义查询是什么并存储它,而不是计算结果并存储它们。

您在这里有几个选择。您可以ToList在查询末尾添加一个;它会急切地评估它,并且存储该列表不会导致问题。

可能破坏的是您的查询正在使用i,它在循环中被更改。由于查询实际上不会评估i循环结束后的内容,i因此将始终具有最后一个值。这很容易通过在循环内添加一个新的局部变量并分配i给它来解决。在查询中使用该局部变量。

于 2012-10-04T18:32:31.957 回答
0

正如其他人所说,queryAllTasks在循环的每次迭代中都推迟了执行。所以你存储的只是一个IQueryable.

你想要的是

tasksForView.Add(queryAllTasks.ToList());

另外,我注意到您正试图以queryAllTasks视图模型的形式返回,但该变量的范围仅限于 for 循环。我假设你想tasksForView作为你的模型返回(我进一步假设它在其他地方声明,因为我在你提供的代码中没有看到它的声明。)

于 2012-10-04T18:49:26.973 回答