2009-01-31 82 views
0

我有一個非常大的問題,解決這一問題 我有2個表複雜的查詢C#

第一個表是: http://lh3.ggpht.com/_uMvfbnPHuko/SYPJQ1ZsBDI/AAAAAAAAAKs/eq49xquy3jM/s800/Untitled-2.jpg

其中包含一個模塊(ID和名稱)

第二張表是 http://lh6.ggpht.com/_uMvfbnPHuko/SYPJQ4IXGwI/AAAAAAAAAK0/zmTIO6V-UEQ/s800/Untitled-3.jpg

其中包含用戶ID及其首選模塊的號碼

現在讓移動到問題 我要生成複選框列表

例如對於具有以下模塊「3,2和4」 用戶ID 1的結果將是

http://lh4.ggpht.com/_uMvfbnPHuko/SYPJQ_LJeVI/AAAAAAAAAK8/6RV8a1S8eCY/s800/Untitled-4.jpg

通知說:「爲您推薦」複選框沒有被選中,因爲用戶1不具有模塊ID「1」

我花了很長時間試圖解決這個問題,使用C#和LINQ

看到我的努力:)(下面的代碼不工作)

var q = from m in db.modules 
      from um in db.usersModules.Where(um2 => um2.userId == myUserId).Single().modules.Trim().Split(',') 
      where um.Contains(m.moduleId.ToString()) 
      select new 
      { 
       moduleid = here i want the module id from modules table 
       modulename = here i want the modulename from modules table 
       ischecked = here i want "true" or "false" depending on if the user has this module or not 

      }; 

如果LINQ是容易的結果,你請儘量解決這個問題呢? 有什麼問題嗎?

回答

2

由於LinqToSQL嘗試將所有內容都轉換爲普通SQL,因此您的查詢不起作用。

如果你不能重構你的架構,並使用一箇中間表,因爲你顯然有許多一對多的關係模型,你可以做這樣的事情:

var userModules = db.userModules.SingleOrDefault(m => m.userId == myUserId).modules; 
// Get the modules of the user (a comma delimited string) 
var integerModules = modules.Split(',').Select(m => int.Parse(m)); 
// Convert the comma delimited string to IEnumerable<int> 

var query = db.modules.Select(x => new { 
       x.moduleId, 
       x.moduleName, 
       isChecked = integerModules.Contains(x.moduleId) 
}); // And finally do the query 
1

你怎麼使用逗號分隔的列表?更好的方法是在其間存儲用戶和模塊之間映射的表格。

+0

我同意你的觀點,但我選擇了這個數據庫模型能夠爲每個用戶存儲模塊的順序 ,例如用戶1具有此順序的模塊3,2,4 – ahmed 2009-01-31 04:31:38

+0

@ahmed:您仍然可以存儲順序,您只需在映射表中有另一列按順序排列並按照升序排列。 – casperOne 2009-02-03 18:41:53

1

如果可以的話,它可能是最好的重構你的表,而不是試圖以應對它在格式的數據。

在你的「usersModule」表中,如果您更改模塊列「的moduleId 「並且爲每個與userId關聯的模塊插入一條記錄,您就可以更輕鬆地查詢我相信的數據,並且您的數據庫將更容易維護。

Table: "modules" 
moduleId moduleName 
1   Recommended... 
2   Blah 
3   ... 

Table: "usersModule" 
userId  moduleId 
1   3 
1   2 
1   4 
+0

我同意但我選擇了這個數據庫模型,以便能夠爲每個用戶 存儲模塊的順序,例如用戶1具有此順序的模塊3,2,4 – ahmed 2009-01-31 04:31:04

+0

您可以在表中添加另一列,如「訂單「,您可以在其中存儲該用戶模塊的等級。你真的不應該在列中放置逗號分隔的ID列表,這使得查詢非常困難。 – 2009-01-31 04:37:33

0

如果是一個選項,則可能需要重構數據庫模式。您的usersModule表應該每行有一個用戶標識和一個模塊標識,並且moduleId列應該是模塊表的外鍵。如果你這樣做,linq查詢將是微不足道的。

如果你原封不動地使用數據庫,那麼可能會使用兩個查詢:一個查詢檢索模塊ID,另一個查詢檢索實際模塊信息。

0

這將是這樣的,我認爲,但你沒有給我足夠的關於你的數據庫結構的確切信息,我準確地寫出查詢。

var q = 
    from m in db.modules 
    select new { 
     m.moduleId, 
     m.name, 
     db.usersModules.Exists(um => um.userId == myUserId) 
    }; 

編輯:哦,我剛剛意識到你有一個逗號分隔的東西。首先正確地重新安排你的數據庫,就像其他人所說的那樣。