我正在尝试将我需要的数据选择为简单的匿名类型来序列化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
});
}
但是当我在val上调用枚举器时,我得到以下异常
Unable to create a null constant value of type 'Anonymous type'. Only entity types, enumeration types or primitive types are supported in this context.
如果外键为null,我实际上确实需要Secondary
为null。如何从select语句中直接获得一个匿名的匿名。
我的想法解决方案是能够直接序列化结果数据,而无需处理中间数据集。
答案 0 :(得分:0)
您可以通过始终返回匿名对象可能具有null属性的匿名来解决此问题。
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 }
});
}
如果您确实想Secondary
如果p.SecondaryId
为空,则可以添加以下内容。
//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;
});
答案 1 :(得分:0)
我本身没有“解决方案”。要解决此问题,我只是预测整个辅助实体。我对这个解决方案不满意。
using (var dbContext = new DataContext())
{
var vals = dbContext.Primaries.Select(p => new
{
Name = p.Name,
Secondary = p.Secondary
});
}
显然,投影整个实体类似于“SELECT *” - 这是一种不好的做法。它可能对您不起作用,具体取决于您的实际查询。