2010-07-23 10 views
4

比方说,我有一个具有一堆股票行情LINQ查询抓斗最早进入每其他价值

TableQuotes 
2010-07-22 09:45:00.000, "ABC", 102.23 
2010-07-22 09:45:00.000, "EFG", 24.65 
2010-07-22 09:45:00.000, "HIJ", 14.20 
2010-07-22 10:45:00.000, "ABC", 104.25 
2010-07-22 10:45:00.000, "EFG", 26.09 
2010-07-22 10:45:00.000, "HIJ", 12.43 
2010-07-23 09:45:00.000, "ABC", 101.23 
2010-07-23 09:45:00.000, "EFG", 23.65 
2010-07-23 09:45:00.000, "HIJ", 16.20 
2010-07-23 10:45:00.000, "ABC", 99.26 
2010-07-23 10:45:00.000, "EFG", 22.09 
2010-07-23 10:45:00.000, "HIJ", 11.43 
... 

我想知道如何编写一个查询的数据库:
1.抓斗只有一个股票每个符号的报价每天
2.抓斗每一天的最早的股票报价的每个符号

因此,举例来说,从我的示例表所期望的结果将是:

Result 
2010-07-22 09:45:00.000, "ABC", 102.23 
2010-07-22 09:45:00.000, "EFG", 24.65 
2010-07-22 09:45:00.000, "HIJ", 14.20 
2010-07-23 09:45:00.000, "ABC", 101.23 
2010-07-23 09:45:00.000, "EFG", 23.65 
2010-07-23 09:45:00.000, "HIJ", 16.20 

回答

8
var result = from tq in TableQuotes 
group tq by new {tq.TimeStamp.Date, tq.Symbol} into g 
select g.OrderBy(tq => tq.TimeStamp).First(); 
+0

你打我吧;) – 2010-07-23 21:48:18

+0

咦?这看起来不像每个日期只会拉一个符号。 – PatrickSteele 2010-07-23 22:01:17

+0

这是不是只能抓住任何公司的最早报价,而不是每家公司? – sgriffinusa 2010-07-23 22:02:40

0

这是搞清楚如何写你的愿望http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx

LINQ查询下面是他们给了你的情况,例如直拷贝一个巨大的资源

var categories = 
    from p in products 
    group p by p.Category into g 
    select new { Category = g.Key, TotalUnitsInStock = g.Sum(p => p.UnitsInStock) }; 
+0

这种代码模式叫做什么:“p => p.UnitsInStock” – sooprise 2010-07-23 21:49:08

+0

这就是所谓的lambda表达式。 – recursive 2010-07-23 21:50:17

+0

匿名委托,在这种情况下使用lambda语法。要获得更完整的答案,请点击此处 - > http://stackoverflow.com/questions/978063/anonymous-delegates-in-c – JupiterP5 2010-07-23 21:52:52

0

下面将返回所请求的解决方案,即每个公司在特定日期的最早报价。

var results = from q in quotes 
       group q by new { q.Symbol, q.TimeStamp.Date } into c 
       select new TableQuote() 
       { 
        Symbol = c.Key.Symbol, 
        TimeStamp = c.Min(ct => ct.TimeStamp), 
        Quote = c.OrderBy(ct => ct.TimeStamp).First().Quote 
       };