选择是否符合条件

时间:2016-03-13 17:40:16

标签: c# linq

假设我有一个包含三列的数据表:timestamp,curveID和price。我想给出时间,然后选择每天的时间戳,curveID和价格,但前提是所有的curveID都存在。

问题是,并非每次都存在所有数据,因此在10:00:00可能只有curveID 1的数据,但ID = 2没有,依此类推。

我以为我可以执行以下操作来选择第一个数据集,其中所有的curveID都在那里且时间大于或等于我的标准:

        dataSet.ReadXml(@"C:\temp\Prices.xml", XmlReadMode.InferTypedSchema);
        ds = dataSet.Tables[0];
        var dt = ds.Clone();
        int criteria = 10;
        var list = ds.AsEnumerable().Where(x => x.Field<DateTime>("Timestamp").Hour >= criteria)
                    .GroupBy(x => new{Date = x.Field<DateTime>("Timestamp").Date, Curve = x.Field<object>("CurveID")})
                    .First().ToList();

但是,对于相同的曲线ID,它会在同一天(在不同时间)返回多个记录。 我想在接近所有curveID存在的标准时间的每一天为每个curveID返回一条记录。

为清楚起见,我想说我正在寻找curveID 1&amp; 2,如果在第1天的10:00:00只有曲线ID 1存在但曲线ID 2缺失我将需要检查是否在10:01:00两者都在那里,如果是,我当天采取两个记录集来自那时。我必须在数据库中检查每天

2 个答案:

答案 0 :(得分:1)

您可能希望先按日期分组,然后按小时使用

等分组
group thing by new {
   firstThing = x.Field<DateTime>("TimeStamp").Date, 
   secondThing = x.Field<DateTime>("TimeStamp").Date.Hour, 
}

我的语法可能有些偏差,但这应该让你朝着正确的方向前进

答案 1 :(得分:1)

// criteria is your integer Hour representation
var criteria = 10;
// array of curveIds to look for
var curveIds = new int[] {1, 2};
var result = 
    // grouping by date first
    ds.GroupBy(x => x.Field<DateTime>("Timestamp").Date, 
        (date, items) => new { date, items = items
            // items with the same timestamp go to one group
            .GroupBy(i => i.Field<DateTime>("Timestamp"), (datetime, timestampItems) => new { datetime, timestampItems })
            // filter by criteria
            .Where(dti => dti.datetime.Hour >= criteria)
            // filter by curveIds
            .Where(dti => curveIds.All(cid => dti.timestampItems.Any(tsi => tsi.Field<int>("curveID") == cid)))
            .OrderBy(dti => dti.datetime)
            .FirstOrDefault() });

最后,您将收到符合您提到的所有要求的“每日”结果:在某些条件之后发生,所有curveIds都是最早的。