C# 在具有多个包含项的mvc linq查询中,仅选择某些字段
当查看生成的json时,我看到一个规则页面包含图像数据。我追踪到这个代码:`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
.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)