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);

または、すべてを 1 つのクエリで実行します。

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

他の人が言っているようqueryAllTasksに、ループの各反復で実行を延期しました。つまり、保存しているのはIQueryable

あなたが欲しいのは

tasksForView.Add(queryAllTasks.ToList());

また、ビューモデルとして戻ろうとしていることに気付きましqueryAllTasksたが、その変数のスコープはforループです。私はあなたがあなたのモデルとして戻りたいと思っていると思いtasksForViewます(あなたが提供したコードにはその宣言が見当たらないので、私はさらに他の場所で宣言されていると思います)。

于 2012-10-04T18:49:26.973 に答える
0

ここでの問題は、ループ変数を閉じていることです。LINQ クエリは可能な限り遅延実行を使用するため、結果を計算して保存するのではなく、クエリを定義して保存するだけです。

ここでいくつかの選択肢があります。ToListクエリの最後にa を追加するだけです。熱心に評価し、そのリストを保存しても問題は発生しません。

壊れている可能性が高いのは、クエリが を使用していることですi。これはループで変更されます。クエリは実際にiはループの終了後まで評価しないためi、最後の値が何であれ、常に保持されます。これは、ループ内に新しいローカル変数を追加して代入するだけで簡単に修正できますi。クエリでそのローカル変数を使用します。

于 2012-10-04T18:32:31.957 に答える