2012-04-25 81 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