获取列表
项目我得到了以下文件:获取列表
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
,然后只是过滤客户。
您可以使用Include feature单一网络来完成这一操作,这应该工作:
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();
}
我THI nk你提供的不是真正的代码,但下面给出了一个todolist对象的未完成项目。
list.Items.Where(q => q.IsCompleted == false);
我花了一些关于它的时间,我相信你需要不同的方法,(请注意它的一些相关的架构,我不能100%地肯定它,它可能需要一些修改)。看起来你想为用户创建一个TODO列表。我认为,它可能会更好,如果你能以一种
- 用户可以有一个或多个任务列表(S)结构的(我假设一个待办事项列表在我的例子)
- 一做列表项可以有实际工作多个实例做
我会遵循类似的结构下面:
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; }
}
上面我有用户类,这是currentl y代表您的用户。然后,我有一个ToDoList的类,它保存着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);
这里我该怎么办:
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,所以只显示一个想法
不错,但你忘了最重要的事情:'TreeNode'将用户映射到todolists。并且只有一个字符串键,所以如果没有RavenDB的知识就不能解决问题。 – jgauffin 2012-04-25 12:43:36
请问'TodoList'有'TodoList's的'List'? – Default 2012-04-25 10:57:26
todolistitem和todolist之间的关系是什么?列表项目中是否有错字? –
daryal
2012-04-25 10:58:10
不清楚这里介绍的所有这些类型之间的关系。 Con提供一些与问题代码相关的内容。 – Tigran 2012-04-25 11:01:41