1

遇到一个奇怪的问题,该问题使用我的 get 方法有效,但在返回 iqueryable 时失败。使用投影或 iqueryable 时的一些限制?我的代码如下所示,简化:

    public class SimpleEntity
    {
            public long Id { get; set; }
            public string Name { get; set; }
            public virtual SimpleEntity Parent { get; set; }
            public virtual ICollection<SimpleEntity> Children { get; set; }

            public SimpleEntity()
            {
                Children = new List<SimpleEntity>();
            }
    }

    public class SimpleEntityResponseDTO
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public NameValueItem ParentReferral { get; set; }
        public IEnumerable<NameValueItem> ChildReferrals { get; set; }

        public NavigationFolderResponseDTO()
        {
            ChildReferrals = new List<NameValueItem>();
        }
    }

    public class NameValueItem
    {
        public long Value { get; set; }
        public string Name { get; set; }
    }

Web API 操作:

        [HttpGet, Queryable]
        public IQueryable<SimpleEntityResponseDTO> List()
        {
                //Generic crudservice returning an iqueryable based on Set<SimpleEntity>
                return _crudService.QueryableList().Project().To<SimpleEntityResponseDTO>();
        }

        [HttpGet]
        public HttpResponseMessage Get(long id)
        {
            SimpleEntity result = _crudSrv.Get(id);
            if (result != null)
                return Request.CreateResponse<SimpleEntityResponseDTO>(HttpStatusCode.OK, Mapper.Map<SimpleEntity , SimpleEntityResponseDTO>(result));
            else
                return Request.CreateResponse(HttpStatusCode.NotFound); 
        }

现在映射:

Mapper.CreateMap<SimpleEntity, SimpleEntityResponseDTO>()
                .ForMember(to => to.ParentReferral, opt => opt.MapFrom(from => new NameValueItem { Name = from.Parent.Name, Value = from.Parent.Id }))
                .ForMember(to => to.ChildReferrals, opt => opt.MapFrom(from => from.Children.Select(o => new NameValueItem {Name = o.Name, Value = o.Id}).ToList() ));

无论如何,父映射都有效。但是儿童映射导致以下问题。

通过 get 方法检索对象时,无论我检索到哪个实体,一切正常。使用 List 时,我得到“对象引用未设置为对象的实例”、“d__b.MoveNext()\r\n--- 堆栈跟踪从上一个引发异常的位置结束---\r\n” . 例如尝试添加 $filter=Id eq 5 (或任何 id),但会导致相同的问题。也许有人可以提示我这里出了什么问题?

4

0 回答 0