【问题标题】:property is filled, but empty in a method (linq select clause)属性已填充,但在方法中为空(linq select 子句)
【发布时间】:2013-12-07 14:52:05
【问题描述】:

我有以下代码:

private IEnumerable<TrainScheduleViewModel> ListSelect(IQueryable<TrainSchedule> query, Page page)
{
    List<TrainScheduleViewModel> viewModels = query
        .Select(t => new TrainScheduleViewModel
            {
                Id = t.Id,
                ...
                DaysOfWeek = BuildDaysOfWeek(t.DaysOfWeek)
            })
        .Page(page)
        .ToList();

    return viewModels;
}

private string BuildDaysOfWeek(IEnumerable<DayOfWeek> daysOfWeek)
{
    var daysOfWeekStr = string.Empty;

    return daysOfWeek.Aggregate(daysOfWeekStr,
        (current, dayOfWeek) => current + ";" + CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) dayOfWeek]);
}

在调试器中,query 有一个对象,DaysOfWeek 属性已填充。但是,在BuildDaysOfWeek 方法中,集合是空的。你能解释一下为什么吗?

两张图片:

PS.1 这是属性的映射:

<bag name="DaysOfWeek" cascade="all-delete-orphan" table="`ScheduleOnDaysOfWeek`">
      <key column="`trainScheduleId`" not-null="true"/>
      <element  column="`dayOfWeek`" type="System.DayOfWeek" not-null="true" />
    </bag>

【问题讨论】:

  • 如果在调试器中展开变量it,值会出现吗?
  • @Baldrick:在BuildDaysOfWeek?没有
  • @user348173 DaysOfWeek 属性填充了来自query 的每个对象?或者它可以是空的?
  • 您使用的是哪个查询提供程序?例如,LINQ to Objects、LINQ to SQL、Entity Framework。还是别的什么?
  • @Grundy:只有一个对象。不能为空。

标签: c# linq iqueryable


【解决方案1】:

如果DaysOfWeek 是一个子集合?如果是这样,您需要eager load 该表才能进行这种类型的投影,例如

List<TrainScheduleViewModel> viewModels = query
    .Select(t => new TrainScheduleViewModel
                {
                    Id = t.Id,
                    ...
                    DaysOfWeek = BuildDaysOfWeek(t.DaysOfWeek)
                })
            .Page(page)
            .Fetch(x => x.DaysOfWeek)
            .ToList();

或者

DaysOfWeek = BuildDaysOfWeek(t.DaysOfWeek.ToList())

【讨论】:

  • 我试过了,但没有帮助。
  • @user348173 你试过ToListFetch 什么?
  • @user348173 你引用的是NHibernate.Linq吗?
  • 仅 NHibernate 和 OracleDataAccess。我有很多疑问,但只有这个问题。
  • @user348173 Fetch 是一个 LINQ 扩展,添加这个引用,它应该可以工作。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多