C# 虽然计数工作正常,但组的不同计数失败
我正在尝试将sql server查询转换为Mongo C驱动程序LINQ。 我有一个表,每个guid有多个条目,每个条目有不同的代码值。 我需要为每个代码获得一个不同的guid计数。我可以在LINQ中进行计数,但当我进行Distinct.Count时,会出现以下异常: 不支持指定的方法 以下是我试图转换的T-SQL:C# 虽然计数工作正常,但组的不同计数失败,c#,mongodb,linq,mongodb-.net-driver,mongodb-csharp-2.0,C#,Mongodb,Linq,Mongodb .net Driver,Mongodb Csharp 2.0,我正在尝试将sql server查询转换为Mongo C驱动程序LINQ。 我有一个表,每个guid有多个条目,每个条目有不同的代码值。 我需要为每个代码获得一个不同的guid计数。我可以在LINQ中进行计数,但当我进行Distinct.Count时,会出现以下异常: 不支持指定的方法 以下是我试图转换的T-SQL: SELECT a.code, substring(convert(varchar, a.create_Date, 107), 1, 6) as create_Date,count(
SELECT a.code, substring(convert(varchar, a.create_Date, 107), 1, 6) as create_Date,count(distinct a.guid) as mycount
FROM table1 a (nolock)
WHERE a.code = 0
AND a.create_Date BETWEEN DateAdd(day, -2 , @startDate) AND DateAdd(day, 1, @startDate)
GROUP BY a.code, substring(convert(varchar, a.create_Date, 107), 1, 6)
Order by 1
以下是我的LINQ:
var result = from tb in collection3.AsQueryable()
where
tb.code == 0
&& tb.create_Date > rptGte
&& tb.create_Date < rptLt
group tb by new
{
tb.code,
create_Date = tb.create_Date.DayOfYear
} into g
select new
{
code = g.Key.code,
create_Date = g.Key.create_Date,
mycount = g.Select(x => x.guid).Distinct().Count() //distinct not working here
};
var resultList = rpt.ToList();
请告诉我这里做错了什么。关键是Linq to SQL/EF中不支持某些Linq to Object构造。一种方法是使用Linq to SQL/EF从WHERE获取数据,然后对使用Linq to对象返回内存的对象执行其余操作 如果没有实际的数据源,就不可能进行测试,但是下面的代码说明了如何进行测试。请注意第一个.ToList调用,它将从数据库中获取结果,然后Linq查询的其余部分将在内存中对返回的对象执行:
public List<Result> GetGroupedResults(DateTime date)
{
return table1
.Select(x => new {x.code, x.create_Date, x.guid })
.Where(x =>
x.code == 0 &&
x.create_Date > date.AddDays(-2) &&
x.create_Date < date.AddDays(1))
.ToList() // Fetch from database
.GroupBy(x => new
{
Code = x.code,
CreateDateStr = x.create_Date.ToString("MMM dd")
})
.OrderBy(g => g.Key.Code)
.Select(g => new Result
{
Code = g.Key.Code,
DateStr = g.Key.CreateDateStr,
Count = g.Select(x => x.guid).Distinct().Count()
})
.ToList();
}
public class Result
{
public int Code { get; set; }
public string DateStr { get; set; }
public int Count { get; set; }
}
我相信这会给你想要的结果。客户端没有做任何事情,因为最后调用ToList来实现结果。此外,由于您已经在按代码==0进行筛选,因此将在guid字段上进行分组 使用MongoDB.Entities; 使用MongoDB.Entities.Core; 使用制度; 使用System.Linq; 命名空间堆栈溢出 { 公共类TeeBee:实体 { 公共整数代码{get;set;} 公共日期时间创建_日期{get;set;} 公共字符串guid{get;set;} } 公共课程 { 私有静态无效字符串[]args { 新的DBtest,localhost; 新[]{ 新建TeeBee{code=0,create_Date=DateTime.UtcNow,guid=xxx}, 新建TeeBee{code=0,create_Date=DateTime.UtcNow,guid=xxx}, 新建TeeBee{code=0,create_Date=DateTime.UtcNow,guid=yyy}, 新建TeeBee{code=1,create_Date=DateTime.UtcNow,guid=xxx}, }.保存; var result=DB.Queryable//供官方驱动程序使用:collection.AsQueryable .Wheretb=> tb.code==0&& tb.create_Date=DateTime.UtcNow.AddDays-1 .GroupBytb=>tb.guid, g、 tbs=>新 { tbs.First.code, tbs.First.create_日期, uniqueGuids=tbs.Selecttb=>tb.guid.Distinct } .Selectx=>new { 代码=x.Code, DateStr=x.create_Date.DayOfYear, Count=x.uniqueGuids.Count } 托利斯特先生; } } }
我建议考虑使用聚合来实现这一点:我知道的没错!这正是我想要避免的。这里的痛苦是有太多的数据,我不想在应用程序端执行操作。但是如果没有别的路,我想我就得走这条路了。谢谢:是的,您需要输入未分组的数据,但是如果您担心您的云出口成本,它将被3列和where子句过滤。@gatsby如果我的答案有帮助,请接受并有选择地向上投票。我在等待是否有另一个答案可以帮助我在数据库端本身处理这个问题。谢谢虽然我会绝对地高估你的答案,但我没有足够的声誉,抱歉!谢谢你的回答,但我在这里面临两个问题:1。您已经按create_Date分组,这是一个datetime字段,我想按该字段的day部分分组。2.当我应用您的代码时,结果列表中只有1项。@盖茨比,如果您可以从mongodb添加一些示例数据以及所需的输出,这将有所帮助。这样我就可以将测试数据插入mongodb,并尝试得出所需的最终结果。