2015-10-17 44 views
0

我有以下SQL和結果:旋轉臺,LINQ語法

SELECT*FROM StockLines WHERE ID in('A','B') AND Stock>=1100 AND Stock<=1105 
-- RESULT 
Stock ID Value 
1100 A 398.02 
1100 B 1803.62 
1101 A 480.07 
1101 B 1794.89 
1102 A 583.24 
1102 B 1800.43 
1103 A 528.9 
1103 B 1808.26 
1104 A 556.14 
1104 B 1801.77 
1105 A 454.87 
1105 B 1778.83 

我用下面的SQL來旋轉表:

SELECT 
    Stock, 
    MIN (CASE ID WHEN 'A' THEN VALUE END) [A], 
    MIN (CASE ID WHEN 'B' THEN VALUE END) [B] 
FROM 
    StockLines 
WHERE 
    Stock>=1100 AND Stock<=1105 
GROUP BY Stock 
-- RESULT 
Stock A B 
1100 398.02 1803.62 
1101 480.07 1794.89 
1102 583.24 1800.43 
1103 528.9 1808.26 
1104 556.14 1801.77 
1105 454.87 1778.83 

的問題是:如何寫第二SQL在LINQ中?

回答

3

我使用LINQ到這個對象,但這種語法能很好地工作LINQ到SQL:

void Main() 
{ 
    var items = new List<StockItem>(); 
    items.Add(new UserQuery.StockItem { ID = "A", Value = 398.02m, Stock = 1100}); 
    items.Add(new UserQuery.StockItem { ID = "B", Value = 1803.62m, Stock = 1100}); 
    items.Add(new UserQuery.StockItem { ID = "A", Value = 480.07m, Stock = 1100}); 
    items.Add(new UserQuery.StockItem { ID = "B", Value = 1794.89m, Stock = 1100}); 
    items.Add(new UserQuery.StockItem { ID = "A", Value = 583.24m, Stock = 1100}); 
    items.Add(new UserQuery.StockItem { ID = "B", Value = 1800.43m, Stock = 1100}); 
    var query = from item in items 
       group item by new { item.Stock } 
       into stocks 
       select new { 
        Stock = stocks.Key.Stock, 
        A = stocks.Where(stock => stock.ID == "A").Min(stock => stock.Value), 
        B = stocks.Where(stock => stock.ID == "B").Min(stock => stock.Value) 
       }; 
} 

public class StockItem 
{ 
    public int Stock { get; set; } 
    public decimal Value { get; set; } 
    public string ID { get; set; } 
} 
+0

'stocks.First()。Stock''可以替換爲'stocks.Key.Stock'。另外我不認爲可以使用First()(使用'FirstOrDefault()')。 –

+1

@KingKing修改答案 – willaien

+0

答案是正確的。工作正常。謝謝。 - 注意:示例中的最後一行的值必須更正爲1001,1001,1002,1002 – harveyt

3

如果我們認識到,這SQL代碼段

MIN (CASE ID WHEN 'A' THEN VALUE END) 

僅僅是

一個快捷方式
MIN (CASE ID WHEN 'A' THEN VALUE ELSE NULL END) 

那麼相應的Linq查詢自然會看起來像這樣

var StockLines = new[] 
    { 
     new { Stock = 1100, ID = "A", Value = 398.02m }, 
     new { Stock = 1100, ID = "B", Value = 1803.62m }, 
     new { Stock = 1101, ID = "A", Value = 480.07m }, 
     new { Stock = 1101, ID = "B", Value = 1794.89m }, 
     new { Stock = 1102, ID = "A", Value = 583.24m }, 
     new { Stock = 1102, ID = "B", Value = 1800.43m }, 
     new { Stock = 1103, ID = "A", Value = 528.9m }, 
     new { Stock = 1103, ID = "B", Value = 1808.26m }, 
     new { Stock = 1104, ID = "A", Value = 556.14m }, 
     new { Stock = 1104, ID = "B", Value = 1801.77m }, 
     new { Stock = 1105, ID = "A", Value = 454.87m }, 
     new { Stock = 1105, ID = "B", Value = 1778.83m }, 
    }; 
    var query = 
     from line in StockLines 
     where line.Stock >= 1100 && line.Stock <= 1105 
     group line by line.Stock into lines 
     select new 
     { 
      Stock = lines.Key, 
      A = lines.Min(item => item.ID == "A" ? (decimal?)item.Value : null), 
      B = lines.Min(item => item.ID == "B" ? (decimal?)item.Value : null), 
     }; 
+0

這種響應更好,因爲支持缺少任何線路並保持矩陣完整性。謝謝。 – harveyt