C# 在具有多个包含项的mvc linq查询中,仅选择某些字段

C# 在具有多个包含项的mvc linq查询中,仅选择某些字段,c#,entity-framework,C#,Entity Framework,当查看生成的json时,我看到一个规则页面包含图像数据。我追踪到这个代码:` .Include(m => m.OrderRuleType) .Include(m => m.OrderRuleType.Type) .Include(m => m.OrderRuleType.Category) // best match fields .Include(m => m.TicketT

当查看生成的json时,我看到一个规则页面包含图像数据。我追踪到这个代码:`

.Include(m => m.OrderRuleType)
            .Include(m => m.OrderRuleType.Type)
            .Include(m => m.OrderRuleType.Category)
            // best match fields
            .Include(m => m.TicketType)
            .Include(m => m.DestTicketType)
            .Include(m => m.Shipper)
            .Include(m => m.CarrierType)
            .Include(m => m.Carrier)
            .Include(m => m.DriverGroup)
            .Include(m => m.Driver)
            .Include(m => m.TruckType)
            .Include(m => m.ProductGroup)
            .Include(m => m.Destination)
            .Include(m => m.Origin)
            .Include(m => m.DestState)
            .Include(m => m.OriginState)
            .Include(m => m.DestRegion)
            .Include(m => m.OriginRegion)
            .Include(m => m.Producer)
        .Where(m => !m.OrderRuleType.Hidden)
        .Where(m => m.ID == id || id == 0)
我尝试在有问题的include(shipper)上执行.select操作,如下所示:

.Include(m => m.OrderRuleType)
            .Include(m => m.OrderRuleType.Type)
            .Include(m => m.OrderRuleType.Category)
            // best match fields
            .Include(m => m.TicketType)
            .Include(m => m.DestTicketType)
            .Include(m => m.Shipper)
            .Include(m => m.CarrierType)
            .Include(m => m.Carrier)
            .Include(m => m.DriverGroup)
            .Include(m => m.Driver)
            .Include(m => m.TruckType)
            .Include(m => m.ProductGroup)
            .Include(m => m.Destination)
            .Include(m => m.Origin)
            .Include(m => m.DestState)
            .Include(m => m.OriginState)
            .Include(m => m.DestRegion)
            .Include(m => m.OriginRegion)
            .Include(m => m.Producer)
        .Where(m => !m.OrderRuleType.Hidden)
        .Where(m => m.ID == id || id == 0)
.Select(m => new { m.ID, m.Name}})
这导致了之后所有代码的红线。 我也试着在上面加了一个.asEnumerable()

.Include(m => m.OrderRuleType)
            .Include(m => m.OrderRuleType.Type)
            .Include(m => m.OrderRuleType.Category)
            // best match fields
            .Include(m => m.TicketType)
            .Include(m => m.DestTicketType)
            .Include(m => m.Shipper)
            .Include(m => m.CarrierType)
            .Include(m => m.Carrier)
            .Include(m => m.DriverGroup)
            .Include(m => m.Driver)
            .Include(m => m.TruckType)
            .Include(m => m.ProductGroup)
            .Include(m => m.Destination)
            .Include(m => m.Origin)
            .Include(m => m.DestState)
            .Include(m => m.OriginState)
            .Include(m => m.DestRegion)
            .Include(m => m.OriginRegion)
            .Include(m => m.Producer)
        .Where(m => !m.OrderRuleType.Hidden)
        .Where(m => m.ID == id || id == 0)
从这些字段中选择多个字段的正确方法是什么?几乎所有这些,我们只使用该表中的ID和name字段

.Include(m => m.OrderRuleType)
            .Include(m => m.OrderRuleType.Type)
            .Include(m => m.OrderRuleType.Category)
            // best match fields
            .Include(m => m.TicketType)
            .Include(m => m.DestTicketType)
            .Include(m => m.Shipper)
            .Include(m => m.CarrierType)
            .Include(m => m.Carrier)
            .Include(m => m.DriverGroup)
            .Include(m => m.Driver)
            .Include(m => m.TruckType)
            .Include(m => m.ProductGroup)
            .Include(m => m.Destination)
            .Include(m => m.Origin)
            .Include(m => m.DestState)
            .Include(m => m.OriginState)
            .Include(m => m.DestRegion)
            .Include(m => m.OriginRegion)
            .Include(m => m.Producer)
        .Where(m => !m.OrderRuleType.Hidden)
        .Where(m => m.ID == id || id == 0)

我可能会在最后做一个.select,但我不知道是否可以在不创建视图模型的情况下选择这样的值。我尝试在发货人包含之后添加一个选择,但它破坏了以下所有包含。

我使用匿名选择解决了这个问题。我无法直接选择进入模型,原因有二:1。一些字段(所有命名字段)是没有设置器的未映射字段,以及2。模型被固定在一张桌子上。以下是工作代码:

.Include(m => m.OrderRuleType)
            .Include(m => m.OrderRuleType.Type)
            .Include(m => m.OrderRuleType.Category)
            // best match fields
            .Include(m => m.TicketType)
            .Include(m => m.DestTicketType)
            .Include(m => m.Shipper)
            .Include(m => m.CarrierType)
            .Include(m => m.Carrier)
            .Include(m => m.DriverGroup)
            .Include(m => m.Driver)
            .Include(m => m.TruckType)
            .Include(m => m.ProductGroup)
            .Include(m => m.Destination)
            .Include(m => m.Origin)
            .Include(m => m.DestState)
            .Include(m => m.OriginState)
            .Include(m => m.DestRegion)
            .Include(m => m.OriginRegion)
            .Include(m => m.Producer)
        .Where(m => !m.OrderRuleType.Hidden)
        .Where(m => m.ID == id || id == 0)
var data = db.OrderRules
                        .Include(m => m.OrderRuleType)
                        .Include(m => m.OrderRuleType.Type)
                        .Include(m => m.OrderRuleType.Category)
                        // best match fields
                        .Include(m => m.TicketType)
                        .Include(m => m.DestTicketType)
                        .Include(m => m.Shipper)
                        .Include(m => m.CarrierType)
                        .Include(m => m.Carrier)
                        .Include(m => m.DriverGroup)
                        .Include(m => m.Driver)
                        .Include(m => m.TruckType)
                        .Include(m => m.ProductGroup)
                        .Include(m => m.Destination)
                        .Include(m => m.Origin)
                        .Include(m => m.DestState)
                        .Include(m => m.OriginState)
                        .Include(m => m.DestRegion)
                        .Include(m => m.OriginRegion)
                        .Include(m => m.Producer)
                    .Where(m => !m.OrderRuleType.Hidden)
                    .Where(m => m.ID == id || id == 0)
                    .Select(m => new { 
                        m.ID,
                        allowRowDeactivate = true,
                        allowRowEdit = true,
                        m.EffectiveDate,
                        m.EndDate,
                        m.Value,
                        m.TypeID,
                        m.OrderRuleType,
                        m.OrderRuleType.Type,
                        m.OrderRuleType.Category,
                        OriginTicketTypeName = m.TicketType.Name ?? BestMatchCore.DEFAULT_LABEL,
                        DestTicketTypeName = m.DestTicketType.Name ?? BestMatchCore.DEFAULT_LABEL,
                        ShipperName = m.Shipper.Name ?? BestMatchCore.DEFAULT_LABEL,
                        CarrierTypeName = m.CarrierType.Name ?? BestMatchCore.DEFAULT_LABEL,
                        CarrierName = m.Carrier.Name ?? BestMatchCore.DEFAULT_LABEL,
                        DriverGroupName = m.DriverGroup.Name ?? BestMatchCore.DEFAULT_LABEL,
                        DriverName = (m.Driver.FirstName + " " + m.Driver.LastName == " ")? BestMatchCore.DEFAULT_LABEL: m.Driver.FirstName + " " + m.Driver.LastName,
                        TruckTypeName = m.TruckType.Name ?? BestMatchCore.DEFAULT_LABEL,
                        ProductGroupName = m.ProductGroup.Name ?? BestMatchCore.DEFAULT_LABEL,
                        DestinationName = m.Destination.Name ?? BestMatchCore.DEFAULT_LABEL,
                        OriginName = m.Origin.Name ?? BestMatchCore.DEFAULT_LABEL,
                        DestStateName = m.DestState.Abbreviation ?? BestMatchCore.DEFAULT_LABEL,
                        OriginStateName = m.OriginState.Abbreviation ?? BestMatchCore.DEFAULT_LABEL,
                        DestRegionName = m.DestRegion.Name ?? BestMatchCore.DEFAULT_LABEL,
                        OriginRegionName = m.OriginRegion.Name ?? BestMatchCore.DEFAULT_LABEL,
                        ProducerName = m.Producer.Name ?? BestMatchCore.DEFAULT_LABEL,
                        CreateDate = m.CreateDateUTC,
                        m.CreatedByUser,
                        LastChangeDate = m.LastChangeDateUTC,
                        m.LastChangedByUser

                        });

这创建了一个只返回我想要的字段的查询。

红线是Intellisense,表示有错误。你能和我们分享一下吗?否则,我们真的不知道如何在这里提供帮助,因为我们看不到任何这些类的定义,它们都至少包含“ID”和“Name”,这就是我所需要的。网格在每列中显示名称。问题在于,特别是托运人模型,它在每个记录中都存储了一个图像。当我尝试对有问题的include进行选择时,下一个include认为我正在尝试将其包含在我正在创建的匿名类型中。我所知道的唯一可行的方法是创建一个视图模型,但我宁愿只选择我想要的数据。你想返回什么?一系列未隐藏的规则?如果是这样的话,那么所有的.Include()语句都有什么用呢。由于包含的数量太多,这个查询的性能似乎会非常差。include将引入整个实体。我将去掉所有的.Include()语句,并用您需要的信息创建一个.Select投影。这将使您只选择您关心的字段,而不是每个包含实体的每个属性。如何从未包含的模型中进行选择?我不知道怎么做。基本模型具有id字段和外键映射的包含模型,主要用于查找它们的名称。我最近刚刚创建了一个类似于此的运营商规则页面,但我的页面没有此页面的性能问题,因为我正在从数据库视图中提取数据。我在linq处于边缘状态,因此我不知道如何解决此问题。当您在选择投影中指定一个属性,如m.OrderRuleType.Category.Name时,它将使用您的实体映射提取正确的信息。
.Include(m => m.OrderRuleType)
            .Include(m => m.OrderRuleType.Type)
            .Include(m => m.OrderRuleType.Category)
            // best match fields
            .Include(m => m.TicketType)
            .Include(m => m.DestTicketType)
            .Include(m => m.Shipper)
            .Include(m => m.CarrierType)
            .Include(m => m.Carrier)
            .Include(m => m.DriverGroup)
            .Include(m => m.Driver)
            .Include(m => m.TruckType)
            .Include(m => m.ProductGroup)
            .Include(m => m.Destination)
            .Include(m => m.Origin)
            .Include(m => m.DestState)
            .Include(m => m.OriginState)
            .Include(m => m.DestRegion)
            .Include(m => m.OriginRegion)
            .Include(m => m.Producer)
        .Where(m => !m.OrderRuleType.Hidden)
        .Where(m => m.ID == id || id == 0)