2015-02-06 46 views
0

我有簡單的對象列表:LINQ的移調名單

var r = new List 
     { 
      new { Id = 1, Value = 2, DateTime = DateTime.Parse("10.10.2014")}, 
      new { Id = 2, Value = 3, DateTime = DateTime.Parse("10.10.2014")}, 
      new { Id = 3, Value = 4, DateTime = DateTime.Parse("10.10.2014")}, 
      new { Id = 1, Value = 5, DateTime = DateTime.Parse("11.10.2014")}, 
      new { Id = 2, Value = 6, DateTime = DateTime.Parse("11.10.2014")} 
     }; 

我想得到這樣的對象:

DateTime | 1 | 2 | 3 | 
10.10.2014 | 2 | 3 | 4 | 
11.10.2014 | 5 | 6 | | 

是否有任何好的LINQ查詢到這一點?在數據庫中的樞軸/不透明可能嗎?

回答

0

你正在尋找一個簡單的GroupBy

var result = r.GroupBy(x => x.DateTime) 
       .Select (grp => new 
       { 
        DateTime = grp.Key, 
        _1 = grp.Where(x => x.Id == 1).Select(x => x.Value).Cast<Int32?>().FirstOrDefault(), 
        _2 = grp.Where(x => x.Id == 2).Select(x => x.Value).Cast<Int32?>().FirstOrDefault(), 
        _3 = grp.Where(x => x.Id == 3).Select(x => x.Value).Cast<Int32?>().FirstOrDefault() 
       }); 

result現在:

enter image description here

+0

我認爲我寧願使用'.Select(x => new Nullable (x.Value)''而不是'.Select(x => x.Value).Cast ()'只是因爲它更安全。 – Aron 2015-02-06 10:02:00

1

試試這個:

r.ToLookup(t => t.id, t=>t.DateTime) 

如果不工作,通過this

您根據ID尋找到組列表中讀出,然後通過字典鍵結果列表。您應該可以使用GroupBy的一些組合來創建這個組合,這會創建一個分組列表和ToDictionary()的列表,該列表允許您指定該對象的屬性作爲關鍵字並從中創建一個字典。

0

如果ID的數量不是在編譯時已知,那麼有沒有辦法創建鏈接語句以將這些ID捕獲爲新字段。 Linq只能做到這一點。你可以在這種情況下,做的最好的是這樣的:

var ids = r.Select(x => x.Id).Distinct().OrderBy(x => x).ToArray(); 

var query = 
    from x in r 
    group x by x.DateTime into gxs 
    let lookup = gxs.ToLookup(x => x.Id, x => (int?)x.Value) 
    select new 
    { 
     DateTime = gxs.Key, 
     Values = ids.Select(i => new 
     { 
      Id = i, 
      Value = lookup[i].FirstOrDefault(), 
     }).ToArray(), 
    }; 

產生這樣的:

result

如果ID已知,那麼下面的變化是最好的:

var query = 
    from x in r 
    group x by x.DateTime into gxs 
    let lookup = gxs.ToLookup(x => x.Id, x => (int?)x.Value) 
    select new 
    { 
     DateTime = gxs.Key, 
     _1 = lookup[1].FirstOrDefault(), 
     _2 = lookup[2].FirstOrDefault(), 
     _3 = lookup[3].FirstOrDefault(), 
    }; 
+1

嗨,@Enigmativity,這張截圖從哪裏來? – 2015-02-06 09:58:13

+2

@NikolayKostov - 我使用http://www.linqpad.net/來運行我的代碼,並從輸出中創建屏幕截圖。 – Enigmativity 2015-02-06 10:00:57

+0

它可以在運行時用Dynamic Linq完成。我設法用它來在未知數量的字段上查詢未知數量的搜索條件(就像在本例中一樣:與必須在結果集中轉置的每個用戶相關聯的字段的垂直列表),返回未知的一組字段並在未知的字段上排序。多領域搜索中的一般多項術語。 System.Linq.Dynamic。 – Triynko 2015-09-25 14:57:10