2014-04-16 120 views
2

Im新手到linq和im使用linq查詢從表中檢索數據。我的想法是列出與特定用戶對應的所有cashsafes並將其顯示在下拉列表中。Linq列表包含方法

表結構如下所示

Table 1 
cashsafeid cashsafename 
    1   cashsafe1 
    2   cashsafe2 
    3   cashsafe3 

Table 2 
Id UserId Cashsafeid 
    1 100  1,2,3 
    2 101  1,3 

我已經得到一個特定用戶的cashsafename說100.How我能實現它 下面的代碼是一個我已經試過,但我卡住

List<Cashsafe> cashsafes=(from c in db.Table 1 
           where c.CashsafeId contains())--Cannot go further 
+0

我想你需要首先解決你的表,讓你能夠得到你想要的東西。 – jomsk1e

+1

你應該重新考慮你的數據庫設計。嘗試(在這種情況下,絕對嘗試)以避免逗號分隔的列。嘗試正常化更多。 – Styxxy

+0

我建議您創建另一個表格來映射兩個表格之間的關係。由於表格的關係是1到很多,每行將包含1個userdid和1個cashsafeid。這樣做會讓你更容易加入你的表格。 – Romeo

回答

4

您以非常低效的方式存儲用戶的Cachsafeid列 - 它不允許爲LINQ提供程序生成高效的SQL。因此,以下解決方案的性能不佳 - 如果您在意這一點,請更改您的表格結構。

var user = db.Table2.Single(u => u.UserId == 100); 
var cachfeIds = user.Cashsafeid.Split(',').Select(int.Parse).ToArray(); 
var cachefes = db.Table1.Where(c => cachfeIds.Contains(c.Id)).ToList(); 

基本上你需要加入表格,但外鍵是「虛擬的」 - 它只是在你的腦海裏。要檢索外鍵值,我們必須拆分每個用戶的Cachsafeid列的值以檢索鏈接的緩存。然後,只有用單獨的請求檢索cachefes(我認爲LINQ將從表中檢索所有值,並在C#代碼中執行Where部分)。

+0

更確切地說,OP需要在'where'之後制定一個條件,當前只有一個成員被取消引用。 – Codor

+0

請仔細閱讀問題我有兩張桌子,我想列出屬於特定用戶(表2) – SparAby

+0

@SparAby的所有cashsafename(表1),謝謝,我已經意識到我錯了。已修復答案 –

0

如果您有沒有想法的加入可以使用

int x = 0; 
       List<int> Users = db.table2.FirstOrDefault(m => m.UserId == 100).Cashsafeid.Split(',').ToList().Where(str => int.TryParse(str, out x)).Select(str => x).ToList(); ; 
       var content = db.table1.Where(m => Users.Contains(m.cashsafeid)).ToList(); 
+0

這裏即時消息,你不能將字符串轉換爲int在第一個linq查詢 – SparAby

+0

現在使用上面的代碼 – DMishra

+0

也許它的工作,但它是如此非常不明顯!你可以放棄TryParse部分 - 他的數據庫值不可能不是數字,如果他們是,我們不應該只是默默地處理損壞的數據。它可能導致更糟糕的數據損壞 –