Asp.net mvc 访问实体框架中包含的表属性
我有两张桌子: 表1(销售): 表2(销售产品): 我有以下声明:Asp.net mvc 访问实体框架中包含的表属性,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我有两张桌子: 表1(销售): 表2(销售产品): 我有以下声明: var topSales = db.Sales.Include(c => c.SaleProducts).Where(p =>p.CustomerId == id); 我想对SaleProducts表进行排序,并根据SaleId外键选择5个top(按数量排序),其中CustomerId等于它在控制器方法中接收到的id。 如何访问SaleProducts属性以执行以下操作: var orderedItems = to
var topSales = db.Sales.Include(c => c.SaleProducts).Where(p =>p.CustomerId == id);
我想对SaleProducts表进行排序,并根据SaleId外键选择5个top(按数量排序),其中CustomerId等于它在控制器方法中接收到的id。
如何访问SaleProducts属性以执行以下操作:
var orderedItems = topSales.OrderByDescending(c => c.Quantity).Take(5);
当我包括SaleProducts表时,我在其中包含了所有属性,但我不能像上面的语句那样对它们进行访问。
非常感谢您的帮助当您访问SaleProducts属性并使用
获取
方法获取5个项目时,您可以通过订购
var prods2 = db.Sales.Include(c => c.SaleProducts)
.Where(p =>p.CustomerId == id)
.Select(g => new
{
SaleId = g.Id,
Products = g.SaleProducts.OrderByDescending(h => h.Quantity)
.Take(5)
.Select(x => new
{
Id = x.Id,
Quantity = x.Quantity
})
}).ToList();
上面的代码将为您提供特定客户的销售额,对于每个客户,它将仅包括前5名销售产品(按数量排序)
我正在将结果投影到一个匿名对象(new{}
)。如果有视图模型,可以将投影更改为该模型
public class SaleVm
{
public int Id { set; get; }
public int CustomerId { set; get; }
public List<SaleProductVm> SaleProducts { set; get; }
}
public class SaleProductVm
{
public int Id { set; get; }
public int SaleId { set; get; }
public int Quantity { set; get; }
}
公共类SaleVm
{
公共int Id{set;get;}
public int CustomerId{set;get;}
公共列表产品{set;get;}
}
公共类SaleProductVm
{
公共int Id{set;get;}
public int SaleId{set;get;}
公共整数数量{set;get;}
}
只需用这些类替换注释性对象投影
List<SaleVm> prods2 = db.Sales.Include(c => c.SaleProducts)
.Where(p =>p.CustomerId == id)
.Select(g => new SaleVm
{
SaleId = g.Id,
Products = g.SaleProducts.OrderByDescending(h => h.Quantity)
.Take(5)
.Select(x => new SaleProductVm
{
Id = x.Id,
Quantity = x.Quantity
})
}).ToList();
List prods2=db.Sales.Include(c=>c.SaleProducts)
.Where(p=>p.CustomerId==id)
.选择(g=>new SaleVm
{
SaleId=g.Id,
Products=g.SaleProducts.OrderByDescending(h=>h.Quantity)
.采取(5)
.选择(x=>new SaleProductVm
{
Id=x.Id,
数量=x.数量
})
}).ToList();
当您访问SaleProducts属性并使用Take
方法获取5个项目时,您可以按进行订购
var prods2 = db.Sales.Include(c => c.SaleProducts)
.Where(p =>p.CustomerId == id)
.Select(g => new
{
SaleId = g.Id,
Products = g.SaleProducts.OrderByDescending(h => h.Quantity)
.Take(5)
.Select(x => new
{
Id = x.Id,
Quantity = x.Quantity
})
}).ToList();
上面的代码将为您提供特定客户的销售额,对于每个客户,它将仅包括前5名销售产品(按数量排序)
我正在将结果投影到一个匿名对象(new{}
)。如果有视图模型,可以将投影更改为该模型
public class SaleVm
{
public int Id { set; get; }
public int CustomerId { set; get; }
public List<SaleProductVm> SaleProducts { set; get; }
}
public class SaleProductVm
{
public int Id { set; get; }
public int SaleId { set; get; }
public int Quantity { set; get; }
}
公共类SaleVm
{
公共int Id{set;get;}
public int CustomerId{set;get;}
公共列表产品{set;get;}
}
公共类SaleProductVm
{
公共int Id{set;get;}
public int SaleId{set;get;}
公共整数数量{set;get;}
}
只需用这些类替换注释性对象投影
List<SaleVm> prods2 = db.Sales.Include(c => c.SaleProducts)
.Where(p =>p.CustomerId == id)
.Select(g => new SaleVm
{
SaleId = g.Id,
Products = g.SaleProducts.OrderByDescending(h => h.Quantity)
.Take(5)
.Select(x => new SaleProductVm
{
Id = x.Id,
Quantity = x.Quantity
})
}).ToList();
List prods2=db.Sales.Include(c=>c.SaleProducts)
.Where(p=>p.CustomerId==id)
.选择(g=>new SaleVm
{
SaleId=g.Id,
Products=g.SaleProducts.OrderByDescending(h=>h.Quantity)
.采取(5)
.选择(x=>new SaleProductVm
{
Id=x.Id,
数量=x.数量
})
}).ToList();
这里有两个选项:
第一种选择。
尝试查询SaleProduct
表而不是Sale
表和Include
Sale
:
var topSaleProducts = db.SaleProducts
.Where(m => m.Sale.CustomerId == id)
.Include(m => m.Sale)
.OrderByDescending(m => m.Quantity)
.Take(5);
现在,根据CustomerId
,您拥有了前5名销售产品,sale
也将被加载
第二种选择。
加载Sale
后,您可以使用显式加载获得前5名的销售产品。请记住,您将通过以下方式查询数据库两次:
// Load the sale first
var topSale = db.Sales.First(m => m.CustomerId == id);
// Then load SaleProducts using Explicit loading.
db.Entry(topSale)
.Collection(m => m.SaleProducts)
.Query()
.OrderByDescending(m => m.Quantity)
.Take(5)
.Load();
这里有两个选项: 第一种选择。 尝试查询
SaleProduct
表而不是Sale
表和Include
Sale
:
var topSaleProducts = db.SaleProducts
.Where(m => m.Sale.CustomerId == id)
.Include(m => m.Sale)
.OrderByDescending(m => m.Quantity)
.Take(5);
现在,根据CustomerId
,您拥有了前5名销售产品,sale
也将被加载
第二种选择。
加载Sale
后,您可以使用显式加载获得前5名的销售产品。请记住,您将通过以下方式查询数据库两次:
// Load the sale first
var topSale = db.Sales.First(m => m.CustomerId == id);
// Then load SaleProducts using Explicit loading.
db.Entry(topSale)
.Collection(m => m.SaleProducts)
.Query()
.OrderByDescending(m => m.Quantity)
.Take(5)
.Load();
我认为,OP不要求获得大于5的数量,可以有100个
SaleProducts
的数量大于5。他想载入前五名them@AdilMammadov:你说得对,我想要按数量订购前5名的产品,在我选择了一个特定的客户后,我想OP不会要求获得数量大于5的产品,数量超过5的产品可能有100种。他想载入前五名them@Adil马马多夫:你说得对,在我选择了一个特定的客户之后,我想要按数量排列的前五名产品