4

我正在尝试将我需要的数据选择为简单的匿名类型来序列化 Json 请求的数据。

using (var dbContext = new DataContext())
{
    var vals = dbContext.Primaries.Select(p => new
    {
       Name = p.Name,
       Secondary = p.SecondaryId.HasValue ? new { Name = p.Secondary.Name } : null
    });
}

但是当我在 vals 上调用枚举器时,我得到以下异常

Unable to create a null constant value of type 'Anonymous type'. Only entity types, enumeration types or primitive types are supported in this context.

如果外键为空,我实际上确实需要Secondary为空。如何直接从 select 语句中获取匿名为空。

我的想法解决方案是能够直接序列化结果数据,而无需处理中间数据集。

4

2 回答 2

0

您可以通过始终返回匿名对象可能具有空属性的匿名来解决此问题。

using (var dbContext = new DataContext())
{
    var vals = dbContext.Primaries.Select(p => new
    {
       Name = p.Name,
       Secondary = new { Name = p.SecondaryId.HasValue ? p.Secondary.Name : null }
    });
}

如果你真的想让Secondarynull if p.SecondaryIdis null 你可以添加以下内容。

//ToList allows you to work with LINQ to Objects rather than Linq to Entities.  
//However, you'll generally want to call ToList() last for performance reasons.
var valsCleaned = vals.ToList()
                      .Select(v => { 
                                       if(v.Secondary.Name == null)
                                       {
                                           v.Secondary == null;
                                       }
                                       return v;
                                   });
于 2013-07-23T03:48:09.840 回答
0

我本身没有“解决方案”。为了解决这个问题,我简单地投影了整个辅助实体。我对这个解决方案不满意。

using (var dbContext = new DataContext())
{
    var vals = dbContext.Primaries.Select(p => new
    {
       Name = p.Name,
       Secondary = p.Secondary
    });
}

显然,投影整个实体类似于“SELECT *”——这是一种不好的做法。它可能对您不起作用,具体取决于您的实际查询。

于 2013-11-04T17:54:49.337 回答