Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 访问实体框架中包含的表属性_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 访问实体框架中包含的表属性

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

我有两张桌子:

表1(销售):

表2(销售产品):

我有以下声明:

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马马多夫:你说得对,在我选择了一个特定的客户之后,我想要按数量排列的前五名产品