如何使用LINQ获取不同表中项目的总存量

时间:2014-06-16 05:40:58

标签: c# linq entity-framework

我有Item和StockLocation表。项目表包含:

  • 的ItemID
  • 名称
  • 股票(未映射到表但存在于Item' s实体中)

和StockLocation的表包含:

  • StockLocationID
  • 的ItemID
  • LocationID
  • 股票

我想用库存显示商品数据。 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; }
}

2 个答案:

答案 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;