Asp.net mvc 如何在LINQ中使用SUM和GROUP BY函数

Asp.net mvc 如何在LINQ中使用SUM和GROUP BY函数,asp.net-mvc,entity-framework,linq,c#-3.0,Asp.net Mvc,Entity Framework,Linq,C# 3.0,事实上,我在LINQ面临一个问题,请帮我解决这个问题。让我谈谈我的问题。我有两张桌子 表1 LocationID LoginID LocationName 1 101 A 2 101 B 3 101 C 在此表中,我们显示了位置名称列表 表2 ID LoginID STOCKID QUANTITY

事实上,我在LINQ面临一个问题,请帮我解决这个问题。让我谈谈我的问题。我有两张桌子

表1

LocationID      LoginID     LocationName
  1               101           A
  2               101           B
  3               101           C
在此表中,我们显示了位置名称列表

表2

ID      LoginID     STOCKID     QUANTITY        LocationID
1         101           1           10              1
2         101           1           -8              1   
3         101           2           20              2   
4         101           2           -5              2   
5         101           1           30              1
在此表中,我们显示了不同位置的库存项目数量列表

现在,我想要的结果是,分别显示每个位置的库存项目的总数量。 结果应该是这样的:

LocationID      LocationName        QUANTITY
  1                 A                   32
  2                 B                   15
让我和你分享我的代码

 public ActionResult GetStockQuantityPartial(int? Stock_ID)
    {
        string loginId = Convert.ToString(Session["LoginId"]);

        var emp = (from m in context.StockMovements
                   join o in context.Locations
                   on m.Location equals o.LocationID
                   where m.Stock_ID == Stock_ID && m.LoginID == loginId
                   group new { m, o } by new { m.Location, m.Quantity, o.Location_Name } into grp
                   select new DisplayQuantityViewModel
                   {
                       Location = grp.Key.Location,
                       LocationName = grp.Key.Location_Name,
                       TotalStockQuantity = grp.Sum(x => x.m.Quantity)
                   }).ToList();


        return PartialView("_DisplayStockQuantity", emp);

    }

问题似乎是您正在根据位置和数量进行分组,而您只希望在位置字段中对移动进行分组

group m by new { o.LocationId, o.Location_Name } into grp
然后求和行变为:

TotalStockQuantity = grp.Sum(x => x.Quantity)
据我所知,StockMovement有一个位置字段,但这是位置ID。使用EF,利用实体间FK关系的导航属性是有益的。通过这种方式,您可以轻松地跨这些关系进行查询,并让EF计算出适当的SQL。这会导致从对象图读取更简单的表达式,而不是类似SQL的联接

例如,与此相反:

public class StockMovement
{
    // ... columns...
    public int Location { get; set;}
}
。。。使用导航属性并寻址表中假定的列命名

public class StockMovement
{
    // ... columns...
    [ForeignKey("Location"), Column("Location")]
    public int LocationId { get; set; }
    public virtual Location Location { get; set; }
}
这假设StockMovement表中LocationId的列称为“Location”。使用
[Column]
属性或自定义映射(请参阅
EntityTypeConfiguration
以获取参考),您可以将EF配置为映射字段,这样即使类引用的表不一致,您的类也可以保持一致的命名方法。也可以将类中的“Location\u Name”更改为“LocationName”。您甚至可以通过利用
.Map(x=>x.MapKey(“Location”)
(EF6)或阴影属性来删除FK列(LocationId)。(EF核心)

利用导航属性可以将表达式简化为:

var emp = context.StockMovements
    .Where(x => x.Stock_ID == stockID && x.LoginID == loginId)
    .GroupBy(x => new { x.Location.LocationId, x.Location.LocationName })
    .Select(g => new DisplayQuantityViewModel
    {
        Location = g.Key.LocationId,
        LocationName = g.Key.LocationName,
        TotalStockQuantity = g.Sum(x => x.Quantity)        
    }).ToList();

从对象图/C的观点来看,我发现这比LINQ语法要容易得多,所以把它扔掉作为一个选项来考虑。

你的代码有什么问题吗?我没有得到这个输出,什么值<代码> StordyId<代码>被传递给动作?表2 StOGHOD <代码> { 1, 2 } <代码> -哪一个?