2015-01-06 174 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

相关问题