我需要一些有关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进行过滤,则过滤器可以正常工作,并且结果可以正确显示,但是如果我按Dates进行过滤,则可以全部显示,就像没有过滤器一样。
Inicio和Fim Date的一些图片...
Inicio
Fim
在我的MSSQL数据库中,我有2条记录,其日期与下面的图像类似...上面的日期范围完全适合我的数据库记录中的1条。
但是,当我在Image中应用日期(Inicio和Fim)时,我得到了2条记录(Count = 2,Average = 2条记录的平均值)。 有什么想法吗?
编辑:经过一些测试,我发现在上面的日期范围内,查询从数据库返回了所有记录,只应返回1个适合范围的记录,而又是另一个范围(Inicio 2018-06 -19 00:00:00; Fim 2018-06-19 23:59:59),根本不会返回任何结果,这是错误的,因为数据库中的第二条记录适合此范围!听不懂,但我怀疑问题是这段代码:
Data = grp.Select(s => s.tblPrincipal.Data).FirstOrDefault()
如果第一个记录适合日期范围,则返回所有记录;如果第一个记录不适合日期范围,则不返回任何结果!
谢谢
答案 0 :(得分:1)
我认为您只需要更早地应用过滤器即可影响汇总值,如下所示:
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();
}
答案 1 :(得分:0)
漫长的工作一天后,我可能会说些愚蠢的事情,但是我发现您的两个数据库元素都完全适合inicio
和fim
的范围。
DataTo和DateFrom以及您的数据集具有相同的日期,月份和年份。您的数据集中的小时数介于00(数据来源)和23(数据来源)之间。
此外,我可以假设您的数据库和代码内部具有不同的格式。 例如:
Database: mm/dd/yyyy, 24hours
Code: dd/mm/yyyy, 12hours
这也可能是问题所在。 希望能帮助到你。如果不清楚的地方,请不要犹豫与我联系。