如何按两个字段分组,另一个字段的最大最小值?

时间:2014-10-21 17:14:47

标签: c# linq mongodb-.net-driver

我有这张桌子(Detec):

door     string;
userName string;
dt       double; // seconds since 01/01/1970 00:00:00

...

我需要group by:door userName,并获得:MIN(dt)MAX(dt)

我有这个linq查询:

var dataQuery = 
    (from d in Detecc
     where d.dt >= fBegin && d.dt <= fEnd
     select new DeteccGet1 { door = d.door, userName = d.userName, dt = d.dt })
    .GroupBy(r => new { r.door, r.userName })
    .Select(grp => new
    {
        door = grp.Key.door,
        userName = grp.Key.userName,
        Min = grp.Min(t => t.dt),
        Max = grp.Max(t => t.dt)
    });

    public class DeteccGet1
    {
        public string door { get; set; }
        public string userName { get; set; }
        public double dt { get; set; }
    }

问题不在于数据返回。 但我有数据:

var dataQuery = (from d in Detecc
   where d.dt >= fBegin && d.dt <= fEnd
   select new DeteccGet { door = d.door, userName = d.userName, dt = d.dt });

你能告诉我这是什么问题吗?

更新 问题出在GetCollection中:

var deteccs = basedatos.GetCollection<Detecc>("Detecc").AsQueryable(); // error!!!!!

代码完成:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;

namespace trialMongoDB
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoServer server = new MongoClient("Server=localhost:27017").GetServer();
            MongoDatabase basedatos = server.GetDatabase("Trial");
            //var deteccs = basedatos.GetCollection<Detecc>("Detecc").AsQueryable(); // error !!!!!!!
            //var deteccs = basedatos.GetCollection<Detecc>("Detecc").FindAll().AsEnumerable(); // ok
            var deteccs = basedatos.GetCollection<Detecc>("Detecc").FindAll().AsQueryable(); // ok

            var queryDat = from d in deteccs
                           group d by new { d.door, d.user } into grp
                           select new
                           {
                               door = grp.Key.door,
                               user = grp.Key.user,
                               min = grp.Min(x => x.dt),
                               max = grp.Max(x => x.dt)
                           };
            foreach (var c in queryDat) Console.WriteLine("{0} {1}, MIN={2} MAX={3}", c.door, c.user, c.min, c.max);

            var queryDat2 = from d in deteccs select d;
            foreach (var c in queryDat2) Console.WriteLine("{0} {1} {2} {3}", c.door, c.user, c.dt, c.pin);

            Console.ReadLine();
        }
    }

    public class Detecc
    {
        public ObjectId _id { get; set; }
        public string door { get; set; }
        public string user { get; set; }
        public double dt { get; set; }
        public string pin { get; set; }
    }

}

更新2: Group by未在MongoDB c#驱动程序中实现,因此我们必须在客户端中使用Group by。查找可以限制注册。

非常感谢你。 抱歉我的英文。

0 个答案:

没有答案