我正在.net环境中使用c#和MVC开发一个Web应用程序。数据库是Oracle,通过DevArt Connector连接到Entity Framework,我首先从中创建了我的实体数据库。 查询的表有一些数据列和一个日期列。
具体问题是:用户将输入查询的特定日期,我将获得包含此特定日期的元素列表(~10k)并获取其所属数据。另外,我需要来自下一个旧日期列表中的每个元素的数据。
注意:对于这些元素,数据集的日期将比用户输入的日期更年轻或更老,有时没有更年轻的日期,因此max()或Top2不会那么容易。
这就是我提出的:
var query = context.BsgApo
.Where(
a => ListOfPznsToDate.Contains(a.Pzns)
&& a.Date <= UserDate
&& context.BsgApo.Any(
sub =>
sub.Pzns == a.Pzns &&
sub.Date < a.Date)
&&
context.BsgApo.Any(
negSub => negSub.Pzns == a.Pzns &&
negSub.Date > a.Date &&
negSub.Date < UserDate
) == false
)
.OrderBy(eL => eL.Pzns).ThenBy(eL => eL.Date)
.Select(MapBsgApoToPreisaenderungsErgebnisListe)
.ToList();
首先,我通过一个元素列表查询表,其中每个元素都有一个唯一的标识符(pzn),所以我将得到我感兴趣的元素,其日期等于或小于用户的日期进入。 然后我做一个子查询,因为我想要(可能存在的)较小日期的数据集。如果有,那么我检查较小的一个和用户输入的日期之间是否没有。
这实际上只有一半,我错过了一些数据,查询需要几秒钟。
那么如何以正确和快速的方式将下一个较旧日期的数据添加到我的元素列表中呢?
答案 0 :(得分:0)
您应该按pzn
对数据进行分组,并在每个组中记录最近的两个条目。同时过滤具有> 1
条目的组:
var query = context.BsgApo
.Where(a => a.Date <= UserDate)
.GroupBy(eL => eL.Pzns)
.Where(grp => grp.Count() > 1)
.SelectMany(grp => grp.OrderByDescending(eL => eL.Date).Take(2))
.OrderBy(eL => eL.Pzns).ThenBy(eL => eL.Date)
.Select(MapBsgApoToPreisaenderungsErgebnisListe)
.ToList();
(遗漏了一些与此无关的部分)