public List<DisplayShareViewModel> GetExportNewBaseList(ReportSearch search, out int total)
{
if (!search.Week.HasValue)
{
GregorianCalendar gc = new GregorianCalendar();
search.Week = gc.GetWeekOfYear(DubaiTimeNow, CalendarWeekRule.FirstDay,
DayOfWeek.Monday);
}
string [] strs=new string[8];
var weeks = search.Weeks;
int getYeas = search.Years.Value;
//推算年
if (search.Week.Value > 0 && search.Week.Value < 8)
{
getYeas -= 1; //当week=1 的时候向前推一年
}
for (int i = 0; i < weeks.Count(); i++)
{
var Year = search.Years;
if (search.Week < weeks[i])
{
Year = getYeas;
}
strs[i]=Year.ToString()+weeks[i];
}
var tbConvention = from c in db.TB_ConventionData
where strs.Contains(c.Year.ToString() + c.Week.ToString())
select c;
IQueryable<DisplayShareViewModel> query = from c in tbConvention
join s in db.TB_Store on c.StoreID
equals s.ID
join f in db.TB_Fields on c.FieldID
equals f.ID
join b in db.TB_BrandProduct on f.BPID
equals b.ID
join con in db.TB_Country on
s.CountryID equals con.ID
join r in db.TB_Retailer on
s.RetailerID equals r.ID
join m in db.TB_Module on f.ModuleID
equals m.ID
where m.ID == (int)ModuleEnum.Mobile ||
m.ID == (int)ModuleEnum.TAB
select new DisplayShareViewModel
{
Year = c.Year,
Week = c.Week,
Value = c.Data,
Brand = b.Name,
BrandId = b.ID,
Country = con.CountryName,
StoreCode = s.StoreCode,
StoreName = s.StoreName,
storeId = s.ID,
RetailerId = r.ID,
CountryId = con.ID,
Category = m.ID
};
#region
if (search.CountryId.HasValue)
{
if (search.CountryId.Value > 0)
{
query = query.Where(a => a.CountryId == search.CountryId.Value);
}
}
if (search.Category.HasValue)
{
if (search.Category.Value > 0)
{
query = query.Where(a => a.Category == search.Category);
}
}
if (search.BrandId.HasValue)
{
if (search.BrandId.Value > 0)
{
query = query.Where(a => a.BrandId == search.BrandId);
}
}
if (!string.IsNullOrEmpty(search.StoreCode))
{
query = query.Where(a => a.StoreCode.ToUpper().Replace(" ", "").Contains
(search.StoreCode.Trim().Replace(" ", "").ToUpper()));
}
if (!string.IsNullOrEmpty(search.StoreName))
{
query = query.Where(a => a.StoreName.ToUpper().Replace(" ", "").Contains
(search.StoreName.Trim().Replace(" ", "").ToUpper()));
}
#endregion
var result = query.OrderByDescending(c => c.StoreCode).ToList();
total = result.GroupBy(w => new { w.storeId, w.Category, w.BrandId }).Count();
if (search.IsExport)
{
search.PageSize = total; //导出所有的数据
}
var resultGroupBy = result.GroupBy(w => new { w.storeId, w.Category, w.BrandId
}).Select(m => m).OrderByDescending(m => m.Key.storeId).Skip((search.PageIndex - 1) *
search.PageSize).Take(search.PageSize).ToList();
// var resultGroupBy = result.GroupBy(w => new { w.storeId, w.Category, w.BrandId
});
List<DisplayShareViewModel> displayShareViewModelList = new
List<DisplayShareViewModel>();
foreach (var Item in resultGroupBy)
{
var displayShare = Item.FirstOrDefault();
DisplayShareViewModel DisplayShare = new DisplayShareViewModel();
DisplayShare.Year = displayShare.Year;
DisplayShare.Week = displayShare.Week;
DisplayShare.Brand = displayShare.Brand;
DisplayShare.BrandId = displayShare.BrandId;
DisplayShare.Country = displayShare.Country;
DisplayShare.StoreCode = displayShare.StoreCode;
DisplayShare.StoreName = displayShare.StoreName;
DisplayShare.Retailer = displayShare.Retailer;
DisplayShare.RetailerId = displayShare.RetailerId;
DisplayShare.CountryId = displayShare.CountryId;
DisplayShare.Category = displayShare.Category;
DisplayShare.storeId = displayShare.storeId;
for (int i = 0; i < weeks.Count(); i++)
{
//推算年
int Year = search.Years.Value;
if (search.Week < weeks[i])
{
Year = getYeas;
}
var list = result.Where(w => w.CountryId == DisplayShare.CountryId &&
w.storeId == DisplayShare.storeId && w.Category == DisplayShare.Category && w.BrandId ==
DisplayShare.BrandId && w.Week == weeks[i] && w.Year == Year);
var sum = 0;
if (list.Count() < 1)
{
SumValue modelcode = new SumValue();
modelcode.Week = weeks[i];
modelcode.Value += sum;
DisplayShare.SumValue.Add(modelcode);
}
else
{
var listCount = list.Count();
foreach (var Itemlist in list)
{
SumValue modelcode = new SumValue();
modelcode.Week = weeks[i];
sum = Convert.ToInt32(string.IsNullOrEmpty(Itemlist.Value) ? "0"
: Itemlist.Value);
modelcode.Value += sum;
DisplayShare.SumValue.Add(modelcode);
}
}
}
displayShareViewModelList.Add(DisplayShare);
}
return displayShareViewModelList;
//return query.ToList();
}
求大神,指点优化这段代码,执行几千数据就卡的要死... 谢谢
这个是实现啥的,算法需要修改才能提高效率
可能的关键修改地方:weeks如果大的话,需要调整;result这个这么多条件查询;list数目影响效率
VS有performance工具,采样看看那句的执行时间最长就可修改
weeks 是一个数据 有8条数据,result要必须要多条件 ,我也不知道该怎么办了
@IT小伙儿: result很多的话,换个结构,如Map等,找起来才能快,如果是List,一个个找肯定不行
@2012: 不能使用MAP 吧 ,问题我有重新更新了一下,麻烦你看一下,谢谢..
没前没后看不懂.应该是你2层循环的原因.
嗯嗯 是多层循环造成的 ,可是不知道怎么去优化了