我有Item和StockLocation表。项目表包含:
和StockLocation的表包含:
我想用库存显示商品数据。 LINQ代码如何获得每件商品的总库存?
更新 我想要实现的,如果是在sql查询中:
select i.ItemID, i.Code, i.Name, SUM(sl.stock) as total from Item i inner join StockLocation sl on i.ItemID = sl.ItemID
group by i.ItemID, i.Code, i.Name
这就是我尝试过的:
public IEnumerable<Item> GetItems()
{
var query = context.Items.Include(i => i.StockLocations).AsNoTracking().Where(i => i.RowStatus == true);
query.GroupBy(i => i.ItemID).Sum(?)
return query.OrderBy(i => i.Name).ToList();
}
我无法在Sum方法中访问StockLocation的股票
更新2: 根据@ just.another.programmer的回答,我将查询修改为:
var query = from i in context.Items.Include(i => i.Category).Include(i => i.Unit).Include(i => i.StockLocations).AsNoTracking()
join sl in context.StockLocations on i.ItemID equals sl.ItemID
where i.RowStatus == true
group sl by i into slg
select new Item()
{
ItemID = slg.Key.ItemID,
Code = slg.Key.Code,
Name = slg.Key.Name,
CategoryID = slg.Key.CategoryID,
UnitID = slg.Key.UnitID,
Stock = (int)slg.Sum(x => x.Stock)
};
我犯了错误&#34;实体或复杂类型&#39; Model.Item&#39;不能在LINQ to Entities查询中构造&#34;。怎么解决这个问题?
物品实体:
public class Item
{
public Guid ItemID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public Guid CategoryID { get; set; }
public Guid UnitID { get; set; }
public int Stock { get; set; }
public virtual Category Category { get; set; }
public virtual Unit Unit { get; set; }
public virtual ICollection<StockLocation> StockLocations { get; set; }
}
答案 0 :(得分:2)
最常见的解决方案是在StockLocation
实体上使用navigation property,让EF担心您的联接。
然后,您可以按Item
本身进行分组,然后从小组中总结出来。
from sl in stockLocations
group sl by sl.Item into g
select new {
Total = g.Sum(x => x.Stock),
Item = g.Key
};
您从该查询中返回的对象是IQueryable<Anonymous>
,其中每个项目都有一个属性Total
,其中包含库存总数,Item
包含项目的所有常规属性
var stockInfo = from sl in stockLocations
group sl by sl.Item into g
select new {
Total = g.Sum(x => x.Stock),
Item = g.Key
};
var sorted = stockInfo.OrderBy(x => x.Item.Name);
var firstItem = sorted.First();
Console.WriteLine(firstItem.Item.Name);
Console.WriteLine(firstItem.Item.Code);
//etc
答案 1 :(得分:-2)
DbContext db= new DbContext();
var stockFromItemTable = db.Items.Sum(x=>x.Stock);
var stockFromItemLocationTable= db.StockLocations.Sum(y=>y.Stock);
var totalStock = stockFromItemLocationTable+stockFromItemTable;