C# 按GroupBy中的日期筛选

C# 按GroupBy中的日期筛选,c#,linq,C#,Linq,我需要一些关于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 {

我需要一些关于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();
    }
所以,如果我按2组合框过滤,过滤器工作良好,结果显示正确,但如果我按日期过滤,如果给出我的全部,就像没有过滤器一样

Inicio和Fim日期的一些图像

Inicio

职能指令手册

在我的MSSQL数据库中,我有2条记录,日期如下图所示。。。上面的日期范围完全符合我的数据库记录

但是,当我在图像(Inicio和Fim)中应用日期时,我得到了2条记录(计数=2,平均值=2条记录的平均值)。 有什么想法吗

编辑:经过一些测试,我发现对于上面的范围日期,查询会返回数据库中的所有记录,而对于另一个范围(Inicio 2018-06-19 00:00:00;Fim 2018-06-19 23:59:59),则根本不会返回任何结果,这是错误的,因为数据库中的第二条记录符合此范围!我不明白,但我怀疑问题在于这段代码:

Data = grp.Select(s => s.tblPrincipal.Data).FirstOrDefault()
如果第一条记录符合日期范围,则返回所有记录;如果第一条记录不符合日期范围,则不返回任何结果


谢谢

在漫长的工作日之后,我可能在说一些愚蠢的话,但我看到的是,您的数据库元素完全符合
inicio
fim
的范围

DataTo和DateFrom以及您的数据集具有相同的日期、月份和年份。数据集的小时数介于00(数据来源)和23(数据来源)之间

此外,我可能假设数据库和代码中有不同的格式。 例如:

Database: mm/dd/yyyy, 24hours
Code: dd/mm/yyyy, 12hours
这也可能是问题所在。
希望能有帮助。如果有不清楚的地方,请随时与我联系。

我认为您只需要更早地应用过滤器,以影响聚合值,如下所示:

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();
}
public IEnumerable LoadData()
{
var ctx=new DbContext();
var set=ctx.tblTimes.AsQueryable();
if(DataFrom.Checked&&DataTo.Checked)
{
DateTime inicio=DataAgentFrom.Value;
DateTime fim=DataAgentTo.值;
set=set.Where(s=>s.Data>=inicio&s.Data s.Included==true)
在t.AID上加入ctx.tblPrincipal中的av等于av.AID
将c连接到av.ConID上的ctx.tblCon等于c.ConID
将e加入到ctx.tblEnt on av.EntID等于e.EntID
t组由新
{
c、 名字,
e、 实体
}玻璃钢
选择新建MyList
{
Con=grp.Key.Name,
Ent=grp.Key.Entity,
Count=grp.Count(),
平均值=总平均值(s=>s时间),
Data=grp.Select(s=>s.tblPrincipal.Data)
});
如果(CmbCon.SelectedItem!=null)
{
所选变量=(tblCon)CmbCon.SelectedItem;
query=query.Where(s=>s.Name==selected.Name);
}
如果(CmbEnt.SelectedItem!=null)
{
所选变量=(tblEnt)CmbEnt.SelectedItem;
query=query.Where(s=>s.Entity==selected.Entity);
}
返回query.ToList();
}

你说的“如果我按日期筛选,如果我全力以赴,就像没有筛选”是什么意思?什么是“日期”?谁是
DataFrom
DataTo
DataFrom.Value
返回一个字符串或日期时间?如果它是一个字符串,您可能应该解析为DateTime是的,就像没有应用任何筛选器一样!对于日期,我指的是日期范围DataFrom和DataTo。这两个是我在表单中使用的两个日期选择器,用于从DataFrom到DataTo范围筛选日期。DataFrom和DataTo是表单中的两个DateTimePicker,用于过滤要在数据属性中应用的日期范围(s=>s.Data>=DataFrom…我已将我的查询DataFrom.Checked和DataTo.Checked转换为Date…能否显示DataFrom和DataTo的值?天数不同-9和19@Dmitry帕夫利夫,今天真的很辛苦,对不起。格式怎么样?成员查询返回两个元素吗?或者你以后会得到两个元素吗?日期格式是相似的数据库和代码上的ar…格式yyyy-MM-dd HH:MM:ssI我几乎可以肯定问题出在这里!Data=grp.Select(s=>s.tblPrincipal.Data).FirstOrDefault()。我在这里试图实现的是从数据库获取日期属性,以便在查询中进行比较!谢谢。但是仍然没有对您的建议进行日期筛选。@CarlosFerreira您确定吗?您的查询中的错误是您只在
grp
中的第一个日期进行筛选,这意味着
grp
可能包含超出指定范围的日期d间隔。此答案中的查询不应返回任何这些,因为数据在分组之前已被过滤。无论如何,这是一种方法。
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();
}