数据分组,连接,筛选处理
var instock = _context.siger_project_preset_separeparttooling_inwarehouse.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid); var outstock = _context.siger_project_preset_separeparttooling_outwarehouse.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid); var purchasestock = _context.siger_project_preset_separeparttooling_purchasemanage.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid && a.state == (int)RowState.Invalid); var stockBaseInfo = _context.siger_project_preset_separeparttooling.Where(a => a.projectid == ProjectId && a.status == (int)RowState.Valid); var groupPurchase = (from puc in purchasestock group puc by puc.sptoolingid into temp select new { sptoolingid = temp.Key, purnum = temp.Sum(a => a.purchasenum) }).ToList(); var groupInstock = (from ins in instock group ins by new { ins.sptoolingid, ins.storageid } into temp select new { sptoolingid = temp.Key.sptoolingid, storageid = temp.Key.storageid, instock = temp.Sum(a => a.num) }).ToList(); var groupOutstock = (from ous in outstock group ous by new { ous.sptoolingid, ous.storageid } into temp select new { sptoolingid = temp.Key.sptoolingid, storageid = temp.Key.storageid, outstock = temp.Sum(a => a.num) }).ToList(); var groupResult = (from gins in groupInstock join gous in groupOutstock on new { gins.sptoolingid, gins.storageid } equals new { gous.sptoolingid, gous.storageid } into temp from s in temp.DefaultIfEmpty() select new { sptoolingid = gins.sptoolingid, storageid = gins.storageid, stock = gins.instock - (s == null ? 0 : s.outstock) }).ToList(); var queryList = (from main in stockBaseInfo join pur in groupPurchase.AsQueryable() on main.id equals pur.sptoolingid into purtemp from pur in purtemp.DefaultIfEmpty() join sto in groupResult.AsQueryable() on main.id equals sto.sptoolingid into stotemp from sto in stotemp.DefaultIfEmpty() select new ResponsePresetStockForDashboard { name = main.sptoolingname, code = main.sptoolingcode, num = sto == null ? 0 : sto.stock, purnum = main.maxstorage - (sto == null ? 0 : sto.stock) - (pur == null ? 0 : pur.purnum), onwaynum = pur == null ? 0 : pur.purnum, minstorage = main.minstorage }); var count = queryList.Count(); Expression<Func<ResponsePresetStockForDashboard, bool>> WarningDataExpression = q => true; if (count != 0 ) { WarningDataExpression = q => q.num + q.onwaynum < q.minstorage; } var result = queryList.Where(WarningDataExpression).ToList(); return result;