2012-04-25 47 views
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)); 
+1

请问'TodoList'有'TodoList's的'List'? – Default 2012-04-25 10:57:26

+0

todolistitem和todolist之间的关系是什么?列表项目中是否有错字? – daryal 2012-04-25 10:58:10

+0

不清楚这里介绍的所有这些类型之间的关系。 Con提供一些与问题代码相关的内容。 – Tigran 2012-04-25 11:01:41

回答

1

你不能让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(); 
} 
0

我THI nk你提供的不是真正的代码,但下面给出了一个todolist对象的未完成项目。

list.Items.Where(q => q.IsCompleted == false); 
+0

不,它不是真正的代码,而是代表我真实(但更大的模型)的示例模型。您的代码不会为特定用户提供所有**未完成的项目。它给了我一个列表中的所有项目。 – jgauffin 2012-04-25 11:40:32

+0

@jgauffin这个问题本身并不明确。你如何存储todoLists,列表? – daryal 2012-04-25 11:41:45

+0

“TodoList”和“TreeNode”作为文档集合存储在''todolists/1“'显示的乌鸦中。 – jgauffin 2012-04-25 11:45:10

0

我花了一些关于它的时间,我相信你需要不同的方法,(请注意它的一些相关的架构,我不能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); 
+0

感谢您的尝试,但是:A)您没有提及用户,而是其副本。我也是这样做的,因为我错了。 b)节点结构是强制性的(树状结构+同一列表可以在许多用户之间共享,并且都有自己的树)。 c)因此,由于共享,所以todolist不能引用用户。 – jgauffin 2012-04-25 12:07:38

+0

@jgauffin,我不知道User和ToDoList有多对多的关系,ToDoList和Items有多对多的关系吗? – Habib 2012-04-25 12:11:44

+0

不可以。项目只能存在于一个列表中。 – jgauffin 2012-04-25 12:23:46

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,所以只显示一个想法

+0

不错,但你忘了最重要的事情:'TreeNode'将用户映射到todolists。并且只有一个字符串键,所以如果没有RavenDB的知识就不能解决问题。 – jgauffin 2012-04-25 12:43:36