2015-05-22 73 views
0

第一次使用automapper,我怀疑这是罪魁祸首。我的搜索页面创建一个搜索对象,然后将其传递到Business类。如果我不搜索任何东西,或搜索一个名字,我会得到正确的40000条左右的记录。如果我搜索Rank,我会得到下面的错误。在复杂对象列表中找不到对象(使用automapper)

任何帮助,将不胜感激

其他信息:对象没有设置为一个对象的一个​​实例。

at lambda_method(Closure , Casualty) 
    at System.Linq.Enumerable.WhereListIterator`1.MoveNext() 
    at System.Linq.Enumerable.<SkipIterator>d__4d`1.MoveNext() 
    at System.Linq.Enumerable.<TakeIterator>d__3a`1.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Business.Casualty.Search.Execute(Casualty Search, Int32 startRowIndex, Int32 maxRows, Int32& TotalCount) in c:\projects\casulaties\Business\Entities\casualty.cs:line 198 
    at UnitTest.TestAutoMapper.Casualty.TestMethod1() in c:\projects\casulaties\UnitTest\TestAutoMapper\Casualty.cs:line 22 

业务

private static List<Casualty> _casualties = null; 
    private static List<Casualty> Casualties 
    { 
     get 
     { 
      if (_casualties == null) 
      { 
       List<Repository.Casualty> casualtiesRepo; 
       using (casualtiesEntities ctx = Utility.getEntity()) 
       {      
        casualtiesRepo= ctx.Casualties 
           .Include(x => x.Cemetery) 
           .Include(x => x.Country) 
           .Include(x => x.Rank) 
           .Include(x => x.Locality) 
           .Include(x => x.Trade) 
           .Include(x => x.Regiment) 
           .Include(x => x.Unit1) 
           .Include(x => x.Unit2) 
           .Include(x => x.Volunteers) 
           .Include(x => x.Photos)            
           .OrderBy(x => x.LastName).ThenBy(x => x.FirstName).ToList(); 
        _casualties = Mapper.Map<List<Casualty>>(casualtiesRepo); 
       }           
      } 

      return _casualties; 
     } 
    } 

      public static List<Casualty> Temp(Casualty Search) 
     { 

      List<Business.Casualty> Repo; 
      IQueryable<Business.Casualty> y = Casualties.AsQueryable(); 

      //Name 
      if (Search.Name != null) 
      { 
       if (!string.IsNullOrWhiteSpace(Search.Name.first)) 
       { 
        y = y.Where(x => x.Name.first.ToLower().Contains(Search.Name.first.ToLower()) || 
             x.Name.first.ToLower().Contains(Search.Name.first.ToLower())); 
       } 
       if (!string.IsNullOrWhiteSpace(Search.Name.last)) 
       { 
        y = y.Where(x => x.Name.last.ToLower().Contains(Search.Name.last.ToLower()) || 
             x.Name.last.ToLower().Contains(Search.Name.last.ToLower())); 
       } 
       //Initials 
       if (!string.IsNullOrWhiteSpace(Search.Name.initials)) 
       { 
        Search.Name.initials = Business.Common.TextHelper.UnSlugify(Search.Name.initials); 
        y = y.Where(x => x.Name.initials.ToLower().Contains(Search.Name.initials.ToLower())); 
       } 
      } 
      //RankID 
      if (Search.Rank != null) 
      { 
       if (Search.Rank.ID > 0) 
       { 
        y = y.Where(x => x.Rank.ID == Search.Rank.ID); 
       } 
      } 

      Repo = y.ToList(); **<---SEARCH BOMBS HERE** 

      return Repo.ToList(); 

     } 

AutoMapper

////Casualty 
     Mapper.CreateMap<Business.Casualty, Repository.Casualty>() 
      .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.Name.first)) 
      .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.Name.last)) 
      .ForMember(dest => dest.Initials, opt => opt.MapFrom(src => src.Name.initials)) 
      .ForMember(dest => dest.Cemetery, opt => opt.MapFrom(src => new Cemetery() { ID = src.Cemetery.ID, Name = src.Cemetery.Name, Latitude = src.Cemetery.Latitude, Longitude = src.Cemetery.Longitude, })) 
      .ForMember(dest => dest.Country, opt => opt.MapFrom(src => new Country() { ID = src.Country.ID, Name = src.Country.Name })) 
      .ForMember(dest => dest.Rank, opt => opt.MapFrom(src => new Rank() { ID = src.Rank.ID, Name = src.Rank.Name })) 
      .ForMember(dest => dest.Locality, opt => opt.MapFrom(src => new Locality() { ID = src.Locality.ID, Name = src.Locality.Name })) 
      .ForMember(dest => dest.Trade, opt => opt.MapFrom(src => new Trade() { ID = src.Trade.ID, Name = src.Trade.Name })) 
      .ForMember(dest => dest.Regiment, opt => opt.MapFrom(src => new Regiment() { ID = src.Regiment.ID, Name = src.Regiment.Name })) 
      .ForMember(dest => dest.Unit1, opt => opt.MapFrom(src => new Unit1() { ID = src.Unit1.ID, Name = src.Unit1.Name })) 
      .ForMember(dest => dest.Unit2, opt => opt.MapFrom(src => new Unit2() { ID = src.Unit2.ID, Name = src.Unit2.Name })) 
      .ForMember(dest => dest.Photos, opt => opt.MapFrom(src => new List<Photo>())) 
      .ForMember(dest => dest.Volunteers, opt => opt.MapFrom(src => new List<Volunteer>())); 

     Mapper.CreateMap<Repository.Casualty, Casualty>() 
      .ForMember(dest => dest.Name, opt => opt.MapFrom(src => new Name() { first = src.FirstName, last = src.LastName, initials = src.Initials }))    
      .ForMember(dest => dest.Country, opt => opt.MapFrom(src => new Country() { ID = src.Country.ID, Name = src.Country.Name })) 
      .ForMember(dest => dest.Rank, opt => opt.MapFrom(src => new Rank() { ID = src.Rank.ID, Name = src.Rank.Name })) 
      .ForMember(dest => dest.Locality, opt => opt.MapFrom(src => new Locality() { ID = src.Locality.ID, Name = src.Locality.Name })) 
      .ForMember(dest => dest.Trade, opt => opt.MapFrom(src => new Trade() { ID = src.Trade.ID, Name = src.Trade.Name })) 
      .ForMember(dest => dest.Regiment, opt => opt.MapFrom(src => new Regiment() { ID = src.Regiment.ID, Name = src.Regiment.Name })) 
      .ForMember(dest => dest.Unit1, opt => opt.MapFrom(src => new Unit1() { ID = src.Unit1.ID, Name = src.Unit1.Name })) 
      .ForMember(dest => dest.Unit2, opt => opt.MapFrom(src => new Unit2() { ID = src.Unit2.ID, Name = src.Unit2.Name })) 
      .ForMember(dest => dest.Photos, opt => opt.MapFrom(src => new List<Photo>())) 
      .ForMember(dest => dest.Volunteer, opt => opt.MapFrom(src => new List<Volunteer>()))     
      ; 

单元测试

 Business.Casualty Search = new Business.Casualty(); 
     Search.Rank = new Business.Rank { ID = 429}; 
     //Search.Name = new Business.Name { first = "joe" }; 


     List<Business.Casualty> _MainList = new List<Business.Casualty>(); 
     _MainList = Business.Casualty.Search.Temp(Search); 

回答

1

我想象的问题是你的linq,而不是自动映射器:

在你的linq中,你假设每个对象都有一个Rank属性 - 是这种情况吗?

if (Search.Rank.ID > 0) 
       { 
        y = y.Where(x => x.Rank.ID == Search.Rank.ID); 
       } 

如果没有,我会改变这

if (Search.Rank.ID > 0) 
       { 
        y = y.Where(x => x.Rank != null && x.Rank.ID == Search.Rank.ID); 
       } 
+0

这完全是它。要清楚,我必须将IF语句包装在另一个中,以确保在查找匹配的ID之前RANK不为空。 –

+0

不错,很高兴它有帮助 –