Linq To Entities排除相关数据

时间:2012-10-18 10:30:01

标签: asp.net-mvc-3 linq linq-to-entities entity-framework-4.1

我正在构建一个使用Entity Framework 4.1的ASP.Net MVC 3 Web应用程序。我还使用工作单元模式和通用存储库。我的模型中有两个实体, Shift ShiftDate 。请参阅下图了解其结构。我们的想法是, Shift 可以有1个或多个 ShiftDates ,而 ShiftDate 只能属于一个 Shift

enter image description here

我希望创建一个查询,返回所有班次的列表,如此

public IList<Shift> GetShifts(int id)
{
   return _UoW.Shifts.Get(s => s.organisationID == id).OrderBy(s => s.startDate).ToList();
}

然后在我的Razor View中,我希望使用foreach循环并列出每个Shift的详细信息。其中一个细节是每个 Shift ShiftDates 的总数。要做到这一点,我会做类似

的事情
foreach(var shiftDate in Model.Shifts)
{
    @Html.DisplayFor(modelItem => item.ShiftDates.Count)
}

这很好,但是,我希望计数排除其ShiftDateStatusID设置为442的 ShiftDates 。为此,我尝试修改我的Linq查询到此

return _UoW.Shifts.Get(s => s.organisationID == id && s.ShiftDates.Any(sd => sd.shiftDateStatusID != 442))
.OrderBy(s => s.startDate).ToList();

然而,这仍然会拉回ShiftDateStatusID为442的ShiftDates。

希望这是有道理的。

非常感谢任何反馈。

感谢。

1 个答案:

答案 0 :(得分:1)

如果你这样做

_UoW.Shifts.Get(s => s.organisationID == id
                     && s.ShiftDates.Any(sd => sd.shiftDateStatusID != 442)

你得到的班次至少有一个ShiftDate除了442之外还有shiftDateStatusID。那么,可能会有很多变化符合这个条件。这些班次的ShiftDates集合将被完全加载,包括442(如果有的话)。

要么在填充视图模型时排除状态为442的ShiftDate,要么仅在计数时排除它们,在进行计数时将其排除在外:

item.ShiftDates.Count(sd => sd.shiftDateStatusID != 442)