在一个句点中查找一个字段的不同值

本文关键字:一个 句点 查找 字段 | 更新日期: 2023-09-27 18:26:33

我有一个包含以下字段的表(detecc):

 uname   string
 door    string
 dt      double (seconds since 1/1/1970)

我有一个运行良好的查询:

double dt1= SeconsdSince1970(DateTime.Now);
double dt0= dt1 - 3600;
var doorSearch = new string[] { "D1", "D2" };
System.Int32 cNow = (from d in detecc
                     where doorSearch.Contains(d.door) &&
                     (d.dt >= dt0 && d.dt <= dt1)
                     select d.uname).Distinct().Count();

但如果我想检索用户(uname),我会得到所有记录(重复):

double dt1= SeconsdSince1970(DateTime.Now);
double dt0= dt1 - 3600;
var doorSearch = new string[] { "D1", "D2" };
var lisUname = (from d in detecc
                     where doorSearch.Contains(d.door) &&
                     (d.dt >= dt0 && d.dt <= dt1)
                     select d.uname).Distinct();

如何获得不同的用户名?

在一个句点中查找一个字段的不同值

如果您正在使用mongodb集合,请尝试

// .ToList() converts to poco list
var lisUname = (from d in detecc
                     where doorSearch.Contains(d.door) &&
                     (d.dt >= dt0 && d.dt <= dt1)
                     select d.uname).ToList();
// distinct is now executed in c# context rather mongodb context
var distinctList = lisUname.Distinct();

更简洁的语法

var list = detecc
    .Where(d => doorSearch.Contains(d.door) && (d.dt >= dt0 && d.dt <= dt1)
    .Select(x => x.uname)
    .ToList();

性能

注意:.Select将始终结束查询并将所有数据(完整文档)传递给本机代码。因此,您可以从服务器获取完整的数据,然后您的代码就可以选择所需的字段。如果只想提取请求的字段,则需要另一种mongodb查询方法。

请参阅Linq驱动程序文档

为了在不同用途方面获得更好的性能:

var list = detecc
    .Where(d => doorSearch.Contains(d.door) && (d.dt >= dt0 && d.dt <= dt1)
    .Distinct() // that way distinct is executed on server side
    .ToList();

为什么使用mongodb链接.Count()不起作用

.Count()是指与自己的参数单独使用。请参阅本文为什么MongoDB Count属性返回所有记录

// Example
int userCount = db.GetCollection("detecc")
        .Count(Query.EQ("uname", searchedUName));

一种更具性能的聚合方法

为了获得更高性能的方法,请使用类似的mongodb聚合

db.collection.aggregate([
    { "$match": { "$and": [ { "prop1": "" }, { "prop2": "" } ] } },
    { "$group": { "_id": "$messageId" } }  
])

请参考这个答案:MongoDb Distinct与查询C#驱动程序