0

以下の書類を入手しました。

public class TreeNode
{
    string Id;
    string Owner;  //"users/1"
    string TodoListId;  //"todolists/1"
    string ParentId; //"treenodes/1"
}

public class TodoList
{
    string Id;
    List<TodoItem> Items;
}

public class TodoListItem
{
    bool IsCompleted;
}

完了していない現在のユーザーのすべてのアイテムを取得するにはどうすればよいですか? ドキュメントのいずれかを再設計する必要がありますか?

私は次のようなものが欲しい:

from all treenodes belonging to the current user
load all todolists
and return all active items within those lists 

ただし、1回のサーバー往復内

更新 2

2つのクエリでそれをやろうとした方法は次のとおりです(SelectManyはサポートされていません):

var todoListIds = _dbSession.Query<UserTreeNode>()
    .Where(x => x.UserId == user.Id)
    .Select(x => x.TodolistId);
var nodes = _dbSession.Query<Todolist>()
    .Where(x => x.Id.In(todoListIds))
    .SelectMany(x => x.Items.Where(item => !item.IsCompleted));
4

4 に答える 4

1

RavenDB に単一のドキュメントのサブセットのみを返すようにすることはできないため、この場合は全体を取得してTodoListからクライアントでフィルタリングする必要があります。

これは、インクルード機能を使用して単一のネットワーク呼び出しで実行できます。これは機能するはずです。

var todoListIds = _dbSession.Query<UserTreeNode>()
    .Include(x => x.TodoListId)
    .Where(x => x.UserId == user.Id)
    .Select(x => x.TodolistId);

foreach (var userListId in todoLisIds)
{
    //This won't cause an extra network call, because the session will have already loaded it
    var todoList = _dbSession.Load<TodoList>(userListId);

    //In-memory filtering to get the outstanding items
    var activeItems = todoList.Items.Where(x => x.IsCompleted).ToList();
}
于 2012-04-26T16:10:22.020 に答える
0

あなたが提供したものは実際のコードではないと思いますが、以下はtodolistオブジェクトからの未完成のアイテムを提供します.

list.Items.Where(q => q.IsCompleted == false);
于 2012-04-25T11:24:54.263 に答える
0

私はそれにしばらく時間を費やしましたが、別のアプローチが必要だと思います (アーキテクチャに関連するものであり、100% 確信が持てないことに注意してください。変更が必要になる場合があります)。ユーザーの TODO リストを作成したいようです。という形で構成できればもっといいと思います

  • ユーザーは 1 つ以上の To Do リストを持つことができます (この例では 1 つの To Do リストを想定しています)
  • 1 つの To Do リスト アイテムには、実際の作業の複数のインスタンスを含めることができます。

以下のような構造に従います。

public class User
{
    public string ID { get; set; }//.... All User Attributes AND

}

public class TodoList
{
    public string Id { get; set; }
    public User owner { get; set; }

}

public class TodoListItem
{
    public string ItemID { get; set; }
    public TodoList parent { get; set; }
    public string ItemDescription { get; set; }
    public bool IsCompleted { get; set; }
}

上には、現在ユーザーを表している User のクラスがあります。次に、 User クラス オブジェクト ( user の id ではない) を保持している ToDoList のクラスがあり、次に ToDoList オブジェクトを親として保持している ToDoListItem があります。
データベースの観点から見ると、User と ToDoList の間には 1 対多の関係があり、ToDoList と ToDoListItem には 1 対多の関係があります。
未完了の作業があるユーザーを検索する場合は、次の linq クエリを試してください。

    var query = from t in listTDL
                where t.IsCompleted == false
                select t.parent.owner;

テスト データ構造を埋めるために、次の行が必要になる場合があります。

User user = new User() { ID = "User1" };

TodoList td = new TodoList() { Id = "TD1", owner = user};

List<TodoListItem> listTDL = new List<TodoListItem>();

TodoListItem tdl = new TodoListItem() { ItemID = "TDL1", ItemDescription = "Frist Item", IsCompleted = false, parent=td };
                listTDL.Add(tdl);
                listTDL.Add(new TodoListItem() { ItemID = "TDL2", ItemDescription = "second Item", IsCompleted = true, parent = td });
listTDL.Add(new TodoListItem() { ItemID = "TDL3", ItemDescription = "third Item", IsCompleted = true, parent = td });
listTDL.Add(new TodoListItem() { ItemID = "TDL4", ItemDescription = "fourth Item", IsCompleted = false, parent = td });


List<User> userList = new List<User>();
userList.Add(user);
于 2012-04-25T11:59:28.553 に答える
0

これが私がする方法です:

var result = todoList.Where
(
  x => nodeList.Any
  (
    y => y.Owner == "ownerId" && y.TodoListId == x.Id
  )
).SelectMany(x => x.Items).Where(z => !z.IsCompleted);

Ps私はRavenDBに慣れていないので、アイデアだけを示しています

于 2012-04-25T12:35:04.993 に答える