2015-01-06 116 views
0

一個listedItem可以是設備和車輛的父對象。我想要包含子類的屬性,具體取決於子類的類型是什麼類型的對象。Linq包含子對象屬性

var type = GetAllQuery(context).FirstOrDefault(x => x.Id == id); 

var listedItem = GetAllQuery(context) 
         .Include(x => x.Images) 
         .Include(x => x.User); 

if (type.GetType().BaseType == typeof(Vehicle)) 
        { 

var vehicle = listedItem as IQueryable<Vehicle>; 
         return vehicle.Include(x => x.VehicleBrand).Include(x => x.VehicleModel).FirstOrDefault(x => x.Id == id); 
} 

設備也一樣。車輛由於某種原因返回空,我似乎無法找出原因。有任何想法嗎?

回答

1

包含在EF返回ObjectQuery<T>中,則不應將其轉換爲Queryable。使用as ObjectQuery<Vehicle>。但你並不需要實際轉換,它已經是車型

也清理代碼,如果用開關更換,更好的建議使用工廠。

像這樣的事情

public class IncludeConfiguratorFactory 
    { 
     public static IConfigurator Get<T>(T type) 
     { 
      switch (type.Name) 
      { 
       case "Vehicle": 
        return new VehicleConfigurator(); 
      } 
     } 
    } 

    public class VehicleConfigurator : IConfigurator 
    { 

     #region IConfigurator Members 

     public void Configure<T>(ObjectQuery<T> items) where T : Vehicle 
     { 
      var vehicle = items.Include(x => x.VehicleBrand); 
      vehicle = items.Include(x => x.VehicleModel); 
     } 

     #endregion 
    } 
    public interface IConfigurator 
    { 
     void Configure<T>(ObjectQuery<T> items); 
    } 

並調用作爲

var listedItem = GetAllQuery(context).Include(x=>x.Images).Include(x => x.User); 

     var provider = IncludeConfiguratorFactory.Get(itemType); 
     provider.Configure(listedItem); 

請注意:上面的代碼沒有進行測試,並可能含有語法錯誤

+0

感謝您的回答即時試圖使其工作目前,我對泛型不太瞭解。直至現在,我改變這部分 '開關(typeof運算(T),請將.Name)' 我有在配置麻煩,因爲它是說考慮使用一個明確的轉換,而不是牛逼 – mcas

+0

所有錯誤: 的約束方法'Data.Repositories.VehicleConfigurator.Configure (System.Data.Entity.Core.Objects.ObjectQuery )'的類型參數'T'必須與接口方法'Data.Repositories.IConfigurator的類型參數'T'的約束匹配。配置(System.Data.Entity.Core.Objects.ObjectQuery )''。考慮使用顯式接口實現。 – mcas

+0

請調查listedItem的類型並匹配configure的簽名。代碼只是一個想法。 – hungryMind

相關問題