【问题标题】:Linq To Entities Exclude Related DataLinq To Entity 排除相关数据
【发布时间】:2012-10-18 10:30:01
【问题描述】:

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

我希望创建一个查询,该查询将返回所有 Shifts 的列表,就像这样

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

然后在我的 Razor 视图中,我希望使用 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。

希望这是有道理的。

任何反馈都将不胜感激。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    如果你这样做

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

    你得到的班次至少有一个ShiftDate 有一个shiftDateStatusID 而不是442。嗯,可能有很多班次满足这个条件。这些班次的ShiftDates 集合将被完全加载,包括具有 442 的那些(如果有)。

    在填充视图模型时,要么必须排除状态为 442 的 ShiftDates,要么在仅用于计数时排除它们:

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

    【讨论】:

    • 谢谢。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多