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 

但在一次服务器往返中

更新 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然后仅在客户端上进行过滤。

您可以使用Include 功能在单个网络调用中执行此操作,这应该可以:

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 列表。我认为,如果你能以某种方式构建它可能会更好

  • 一个用户可以有一个或多个待办事项列表(在我的示例中我假设了一个待办事项列表)
  • 一个待办事项列表项可以有多个实际待办事项实例

我将遵循类似于以下的结构:

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 类,它当前代表您的用户。然后我有一个 ToDoList 类,它持有 User 类对象(不是 user 的 id),然后我有 ToDoListItem ,它持有 ToDoList 对象作为父对象。
如果我们从数据库的角度来看,那么我们在 User 和 ToDoList 之间存在一对多关系,而在 ToDoList 和 ToDoListItem 之间又是一对多关系。
现在,如果您想搜索未完成工作的用户,只需尝试以下 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 回答