更改Odata中集合的序列化



我有以下对象:

public class Car 
{
   public virtual int Id {get;set;}
   public virtual IList<Spec> Specs { get; set; }
   public virtual IList<Owner> Owners { get; set; }
}
public class Spec
{
   public virtual int Id { get; set;}
   public virtual string Info { get; set;}
}
 public class Owner: ILast
{
   public virtual int Id { get; set;}
   public virtual string FullName{ get; set;}
   public virtual DateTime DateTime { get; set;}
}

CarOwner有1:M,但我想当我请求Car实体时,我得到的不是数组,而是单个实体。

public class BaseController<T> : ApiController where T : IEntity
{
        private readonly IRepository<T, TKey> _repo;
        public BaseReadController(IRepository<T, TKey> repo)
        {
            _repo = repo;
        }
        public IQueryable<T> Get()
        {
          return _repo.Query();
        }
}

如果实现ILast接口,则Query返回IQuerable并具有选择具有最后一个DateTime属性的实体的谓词。例如,我们在Owner表中有以下数据:

所有者表:

id | FullName | DateTime | CarId
1      name1    12.01.13   1
2      name2    15.04.15   1

查询将只返回第二个。

在JSON结果我将得到(假设Spec表也有2条记录):

Car = {
  id: 1,
  Specs: {
     [0]: object with spec properties,
     [1]: object with spec properties,   
  },
  Owners: {
     [0]: {
         id: 1,
         FullName: 'name2',
         DateTime: '15.04.5'
      }
  }
}

但是,我想改变序列化,Owners属性总是包含一条记录。我想要得到以下JSON:

Car = {
      id: 1,
      Specs: {
         [0]: object with spec properties,
         [1]: object with spec properties,   
      },
      Owners: {
         id: 1,
         FullName: 'name2',
         DateTime: '15.04,.5'
      }
    }

可以通过接口判断实体

p。我用OData

您可以通过编写自定义序列化来实现这一点,但我不建议使用单个对象覆盖数组项表示,因为那样就不是标准了。

我建议在Car对象中创建两个属性,一个Owner和另一个过去的所有者,并且不要通过使用JSON ignore将过去的所有者暴露给用户。

相关内容

  • 没有找到相关文章

最新更新