过滤相关对象的数据

时间:2016-12-30 22:54:45

标签: mysql asp.net entity-framework

我在从数据库中检索正确的数据集时出现问题。我对它的了解还不足以解决它。

我正在为我的叔叔他的运输公司创建一个申请表。所以他有驱动任务的司机,并且每次任务都会让驾驶员驾驶多次驾驶。所以它看起来像:一个驱动程序具有零个或多个赋值,但是一个赋值仅适用于一个驱动程序,一个赋值具有多个驱动器,但驱动器仅用于一个赋值。

我要做的是从月份开始获取驱动程序的所有驱动器,因为我需要将其导出到Excel,并且我想在应用程序中创建月度概览。这就是我从驱动程序中获取所有驱动器所做的一切:

public Chauffeur FindAlleOpdrachtenRitten(string id)
{
    return _ctx.Users
    .Include(o => o.Opdrachten)
    .Include(o => o.Opdrachten.Select(x => x.Ritten))
     // .Where(o => o.Opdrachten.(r => r.Datum == DateTime.Now))
    .SingleOrDefault(x => (x.Id == id));
}

或者将它放在(我的)SQL语句中它应该如下所示:

    SELECT * FROM ICS.AspNetUsers as a 
    INNER JOIN ICS.Opdrachts as o on a.Id = o.ChauffeurID 
    INNER JOIN ICS.Rits as r on o.OpdrachtID = r.OpdrachtID
    WHERE a.UserName = "dimitrivantillo@gmail.com"
    AND r.Datum > "1-12-2016";

代码段已经显示了我已经尝试过但不起作用的东西(而DateTime.Now只是为了尝试一些东西)。所以我正在寻找一些如何解决这个问题的指导。我正朝着正确的方向看吗?我发现其他一些主题或多或少有相同的问题,但与我的情况不太接近。

导出到excel功能正在运行,但我的最终目标是通过不查询所有表行并仅查询特定月份来保存数据库。 我一直在考虑获取所有行并过滤特定月份,但最终会消耗大量资源吗? (几年后)。

另请注意,我是荷兰语。司机=司机,Opdracht = Assignment和Rit = drive

感谢阅读并希望帮助我:D

编辑:包含它们自己正在工作,我得到所有必要的数据,但不是过滤后的相关对象。因此,所有驱动器而不是特定月份的驱动器因为where函数不起作用

1 个答案:

答案 0 :(得分:0)

Include无法过滤。但是,应用我解释的here,但更深层次,你可以实现你想要的:

_ctx.Configuration.LazyLoadingEnabled = false;
var user = _ctx.Users
               .Where(u => u.Id == id)
               .Select(u => new
               {
                   User = u,
                   Opdrachten = u.Opdrachten,
                   Ritten = u.Opdrachten
                             .SelectMany(o => o.Ritten
                                               .Where(r =>  r.Datum == DateTime.Now))
               })
               .SingleOrDefault();
return user?.User;

查询将您需要的所有数据收集到上下文的缓存中,EF通过 relationship fixup 将它们相互连接。因此,每个Opdracht都会有一个Ritten集合,仅在今天的项目中填充。

禁用延迟加载,否则当您访问它时,EF仍会从数据库中填充导航属性。