获取列表的项目
本文关键字:项目 列表 获取 | 更新日期: 2023-09-27 18:32:23
我得到了以下文件:
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));
你不能
让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();
}
我认为您提供的不是真正的代码,但以下内容为您提供了来自待办事项列表对象的未完成项目。
list.Items.Where(q => q.IsCompleted == false);
我花了一些时间,我相信你需要一种不同的方法,(请注意它与架构有关的东西,我不能 100% 确定它,它可能需要一些修改)。您似乎想为用户创建待办事项列表。我认为,如果你能以一种
- 用户可以有一个或多个待办事项列表
- (在我的示例中,我假设了一个待办事项列表)
- 一个待办事项列表项可以有多个实际待办工作的实例
我将遵循类似于以下内容的结构:
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; }
}
上面我有一个用户类,它目前代表您的用户。然后我有一个用于ToDoList的类,它持有用户类对象(不是用户的ID),然后我有ToDoListItem,它持有ToDoList对象作为父级。
如果我们从数据库的角度来看,那么用户和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);
以下是我会怎么做:
var result = todoList.Where
(
x => nodeList.Any
(
y => y.Owner == "ownerId" && y.TodoListId == x.Id
)
).SelectMany(x => x.Items).Where(z => !z.IsCompleted);
附言我不熟悉RavenDB,所以只展示一个想法