子对象属性的 Linq 包含

本文关键字:Linq 包含 属性 对象 | 更新日期: 2023-09-27 18:36:28

列出的项可以是设备和车辆的父对象。我想根据子类的对象类型包含子类的属性。

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);
}

设备也是如此。 由于某种原因,车辆返回 null,我似乎找不到原因。有什么想法吗?

子对象属性的 Linq 包含

包含在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);

请注意:上述代码未经测试,可能包含语法错误