2013-10-23 37 views
-1

我有一個類似於鍵值對設計結構的表。我想根據關鍵和值來查詢表格,但我面臨一些問題。以下是我的表格結構和預期輸出。使用EF查詢鍵值對設計表使用EF

表1:

ID KEY VALUE

1 NAME  abc 
2 AGE   12 
3 DEPARTMENT CCB 
4 NAME  xyz 
5 AGE   13 
6 DEPARTMENT TSS 
7 NAME  cde 
8 AGE   12 
9 DEPARTMENT TMS 
Table 2: 

KeyId KeyName 
1  Name 
2  Department 
3  Age 

爲我表1中直接鍵名進入容易理解,實際上存在着表之間的外鍵關係1和表2.

另外,表2可以容納任何東西作爲KeyName而不是n無論是姓名,部門還是年齡。

預期成果是:我需要用名稱來獲取數據包含%C%和年齡= 12

 Name Age Department 
    abc 12 CCB 
    cde 12 TMS 

注意:我在尋找一個解決方案EF即LINQ查詢,而不是SQL查詢。

選項我嘗試了,下面是查詢:

變種臨時= (from c in table1 where c.Name.Contains("C") || C.Age == 12 Select new { C.Name, C.Age })

思想應用「OR」條件,使我得到這兩個條件滿足,然後篩選使用「一旦我從數據庫中獲取數據,就會在內存中執行「AND」。但我無法成功。

+1

你的桌子設計不合適。名稱,年齡和部門沒有關係,因此幾乎不可能編寫一個查詢(用linq或sql)來保證正確的數據。考慮重新設計你的桌子。 – Mansfield

+0

@Mansfield我不認爲你可以從一張桌子上看出來。 DotNetNuke的ProfileProperties表具有類似的設計。可能有另一個表具有將每個用戶鏈接到此表中的ID的ID列表。 –

+2

@ L_7337問題是,沒有提及這個其他表格,但它是需要可靠地生成問題的「期望輸出」的。沒有它,這3個鍵之間的唯一聯繫就是它們在表中的相對位置,這是弱執行的,並導致不必要的低效和令人費解的查詢。 – nmclean

回答

0

試試這個:如果

var result = input.Select((x,i)=>new {x,i}) 
        .GroupBy(a=>a.i/3) 
        .Where(g=>g.FirstOrDefault().x.Value.Contains("c") && 
          Convert.ToInt32(g.Skip(1).FirstOrDefault().x.Value) == 12) 
        .Select(g=> new { 
          Name = g.FirstOrDefault().x.Value, 
          Age = Convert.ToInt32(g.Skip(1).FirstOrDefault().x.Value), 
          Department = g.Skip(2).FirstOrDefault().x.Value 
          }); 

不知道它在EF,但看起來像如果沒有,你有input後追加任何方法之前,AsEnumerable()執行在客戶端的查詢。

+0

我們有一個ID,所以我們應該嘗試在LINQ的索引('a.i')上進行分組,以免結果以任何原因出現在不同的順序中。你也可以用'ElementAt(x)'代替'Skip(x).First()'。 – nmclean

+0

@nmclean我不確定'ElementAt'是否適用於'EF',對於客戶端'LINQ',我們可以自由地做很多事情,但對於'LINQ to Entity',我們需要經驗來確保它的工作,實際上我沒有用過'EF'。對於'index',我也不確定'ID'是否具有確切的值,我唯一確定的是行的順序應該是'Name,Age,Department - Name,Age,Department - 。 ..' –