c# - 按 GroupBy 中的日期过滤
问题描述
对于使用 LINQ 查询的按日期过滤器,我需要一些帮助。
所以,
这是我的课:
public class MyList
{
public string Ent { get; set; }
public string Con { get; set; }
public int Count { get; set; }
public double? Med { get; set; }
public DateTime Data { get; set; }
}
我的查询:
public IEnumerable<MyList> LoadData()
{
var ctx = new DbContext();
var query = (from t in ctx.tblTimes.AsQueryable().Where(s => s.Included == true)
join av in ctx.tblPrincipal on t.AID equals av.AID
join c in ctx.tblCon on av.ConID equals c.ConID
join e in ctx.tblEnt on av.EntID equals e.EntID
group t by new
{
c.Name,
e.Entity
} into grp
select new MyList
{
Con = grp.Key.Name,
Ent = grp.Key.Entity,
Count = grp.Count(),
Med = grp.Average(s => s.Time),
Data = grp.Select(s => s.tblPrincipal.Data).FirstOrDefault()
});
if (CmbCon.SelectedItem != null)
{
var selected = (tblCon)CmbCon.SelectedItem;
query = query.Where(s => s.Name == selected.Name);
}
if (CmbEnt.SelectedItem != null)
{
var selected = (tblEnt)CmbEnt.SelectedItem;
query = query.Where(s => s.Entity == selected.Entity);
}
if(DataFrom.Checked && DataTo.Checked)
{
DateTime inicio = DataAgendFrom.Value;
DateTime fim = DataAgendTo.Value;
query = query.Where(s => s.Data >= inicio && s.Data <= fim);
}
return query.ToList();
}
我的 OnLoad 事件:
private void Form_OnLoad(object sender, EventArgs e)
{
data.DataSource = LoadData();
data.Columns["Data"].Visible = false;
}
所以,如果我按 2 ComboBox 过滤,过滤器工作正常并且结果显示正确,但如果我按日期过滤,如果我全力以赴,就像没有过滤器一样......
来自 Inicio 和 Fim Date 的一些图像...
伊尼西奥
菲姆
在我的 MSSQL 数据库中,我有 2 条记录,其日期如下图所示……上面的日期范围完全适合我的数据库记录中的 1 条。
但是,当我在 Image(Inicio 和 Fim)中应用日期时,我得到了 2 条记录(计数 = 2,平均值 = 2 条记录的平均值)。有任何想法吗?
编辑:经过一些测试后,我发现对于上面的范围日期,查询返回数据库中的所有记录时,只应返回 1 条适合范围的记录,但具有另一个范围(Inicio 2018-06-19 00:00:00;Fim 2018 -06-19 23:59:59),根本没有返回结果,这是错误的,因为数据库中的第二条记录在这个范围内!无法理解,但我怀疑问题出在这段代码上:
Data = grp.Select(s => s.tblPrincipal.Data).FirstOrDefault()
如果第一条记录适合日期范围,则返回所有记录,如果第一条记录不适合范围,则不返回任何结果!
谢谢
解决方案
我认为您只需要提前应用过滤器即可影响聚合值,如下所示:
public IEnumerable<MyList> LoadData()
{
var ctx = new DbContext();
var set = ctx.tblTimes.AsQueryable();
if(DataFrom.Checked && DataTo.Checked)
{
DateTime inicio = DataAgendFrom.Value;
DateTime fim = DataAgendTo.Value;
set = set.Where(s => s.Data >= inicio && s.Data <= fim);
}
var query = (from t in set.Where(s => s.Included == true)
join av in ctx.tblPrincipal on t.AID equals av.AID
join c in ctx.tblCon on av.ConID equals c.ConID
join e in ctx.tblEnt on av.EntID equals e.EntID
group t by new
{
c.Name,
e.Entity
} into grp
select new MyList
{
Con = grp.Key.Name,
Ent = grp.Key.Entity,
Count = grp.Count(),
Med = grp.Average(s => s.Time),
Data = grp.Select(s => s.tblPrincipal.Data).FirstOrDefault()
});
if (CmbCon.SelectedItem != null)
{
var selected = (tblCon)CmbCon.SelectedItem;
query = query.Where(s => s.Name == selected.Name);
}
if (CmbEnt.SelectedItem != null)
{
var selected = (tblEnt)CmbEnt.SelectedItem;
query = query.Where(s => s.Entity == selected.Entity);
}
return query.ToList();
}
推荐阅读
- google-api - 错误:未找到:使用带有颤振的 googleapis_auth 飞镖团队包时的“dart:html”
- asp.net-core - 当我使用 Windows 服务运行我的网站时,我无法访问 wwwroot 中的 index.html
- sql - SAS 日期时间 22.3 到 yymmddn8
- eclipse - Katalon IDE 生成的脚本在 Eclipse 中出现错误
- kubernetes - 将 Kubernetes 机密挂载为具有 rw 权限的文件
- bash - 从文件中获取输入并将它们存储在 shell 脚本中的不同变量中
- firebase-storage - 如何知道文件名在firebase云存储中是否包含其他字符串?
- android - 为什么 gradle plugin 3.3.0 不想构建 google-services?
- python - Python:break语句在for循环中不起作用
- javascript - 如何停止位置:固定跳转到顶部