Asp.net mvc 如何在LINQ中使用SUM和GROUP BY函数
事实上,我在LINQ面临一个问题,请帮我解决这个问题。让我谈谈我的问题。我有两张桌子 表1Asp.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
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 } <代码> -哪一个?