在lambda / linq中添加可以包含null的字段

时间:2014-01-26 07:32:09

标签: linq entity-framework lambda

我有一个下拉列表,我想用数据库中的五个字段填充。 我正在使用Entity framework 6lambda/linq。 我有两个问题。

  1. 当我将这些字段一起添加时,它只显示下拉列表中的第一个字段(a.tblRegion.Name)。我希望它看起来像“地区”“商店”“位置”“日期”。然而,除了“地区”字段,它们都可以为空。
  2. 我还希望其中一个字段是日期字段,但会引发错误。
  3. 目前我的代码看起来像这样。

    var query = db.tblActivityReports.Where(ap => ap.Deleted == false)
      .Select(a => new
      {
        activity = a.tblRegion.Name != "" ? a.tblRegion.Name : string.Empty + " " + 
        a.tblStore.Name != "" ? a.tblStore.Name : string.Empty + " " + 
        a.Location != "" ? a.Location : string.Empty, 
        activityId = a.ActivityReportId, 
        participant = a.tblActivityParticipants
       });
    

    如果我添加日期字段,我会收到此错误: "Unable to cast the type 'System.DateTime' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types."

1 个答案:

答案 0 :(得分:1)

我建议你从数据库中获取所需的数据,然后在客户端进行数据格式化 - 实际上在数据库上格式化UI的字符串并不是一个好主意。因此,在加载所有必需的数据后,您将能够使用String.Format并将DateTime转换为string:

db.tblActivityReports
  .Where(ar => !ar.Deleted)
  .Select(ar => new {
     RegionName = ar.tblRegion.Name,
     StoreName = (ar.tblStore == null ? null : ar.tblStore.Name),
     ar.Location,
     ar.ActivityDate,
     ActivityId = ar.ActivityReportId, 
     Participants = ar.tblActivityParticipants 
  })
  .AsEnumerable() // move query to memory
  .Select(x => new {
     Activity = String.Format("{0}{1}{2}{3}",
                   x.RegionName, x.StoreName, x.Location, x.ActivityDate),
     x.ActivityId,
     x.Participants
  });

您甚至可以将结果映射到某些ViewModel,后者将负责返回格式化字符串。

提示:如果你想要与空格连接的值,那么你可以使用String.Join而不是格式化:

Activity = String.Join(" ", 
 (new object[] { x.RegionName, x.StoreName, x.Location, x.ActivityDate })
 .Where(o => o != null))