3
我有兩個過濾器。一種是按月份,年份,日期分組,另一種過濾器是選擇是否有人想按產品或公司分組。還可以有更多的過濾器。現在在一開始我寫了如果其他條件如下。Linq中基於過濾器的動態分組
List<IGrouping<String, TopItemReportData>> GroupedData = new List<IGrouping<String, TopItemReportData>>();
if (filters.DateBy.ToLower().Replace(" ", "") == "yearlyreport")
GroupedData = topsalesQueryable.GroupBy(x => x.SalesDate.Year.ToString()).OrderByDescending(x => x.Sum(y => y.SellingQuantity)).Skip((filters.CurrentPage - 1) * filters.RecordsPerPage).Take(filters.RecordsPerPage).ToList();
else if (filters.DateBy.ToLower().Replace(" ", "") == "monthlyreport")
GroupedData = topsalesQueryable.GroupBy(x => x.SalesDate.Month.ToString()).OrderByDescending(x => x.Sum(y => y.SellingQuantity)).Skip((filters.CurrentPage - 1) * filters.RecordsPerPage).Take(filters.RecordsPerPage).ToList();
else
GroupedData = topsalesQueryable.GroupBy(x => x.SalesDate.Date.ToString()).OrderByDescending(x => x.Sum(y => y.SellingQuantity)).Skip((filters.CurrentPage - 1) * filters.RecordsPerPage).Take(filters.RecordsPerPage).ToList();
if (filters.GroupBy.ToLower().Replace(" ", "") == "variantoption")
GroupedData = topsalesQueryable.GroupBy(x => (x.VariantId).ToString()).OrderByDescending(x => x.Sum(y => y.SellingQuantity)).Skip((filters.CurrentPage - 1) * filters.RecordsPerPage).Take(filters.RecordsPerPage).ToList();
else if (filters.GroupBy.ToLower() == "product")
GroupedData = topsalesQueryable.GroupBy(x => (x.ProductId).ToString()).OrderByDescending(x => x.Sum(y => y.SellingQuantity)).Skip((filters.CurrentPage - 1) * filters.RecordsPerPage).Take(filters.RecordsPerPage).ToList();
但是,這不會工作,因爲現在我必須根據選定的過濾器值同時分兩年和產品。所以,我不知道什麼被作爲編譯器給錯誤替換字符串時,我嘗試這樣做:
GroupedData = topsalesQueryable.GroupBy(x => new {x.SalesDate.Year.ToString(),x.ProductId.ToString()}).OrderByDescending(x => x.Sum(y => y.SellingQuantity)).Skip((filters.CurrentPage - 1) * filters.RecordsPerPage).Take(filters.RecordsPerPage).ToList();
匿名類型的成員必須有一個成員分配聲明。我的問題是如何擺脫如果其他以及如何解決這個錯誤
我懷疑Entity Framework會喜歡'string.Format' :) –
@IvanStoev是對的。 string.Format不適用於linq –
@SafiMustafa好的,它不是那麼優雅,只是試着'x.SalesDate.Year +「|」 + x.ProductId' –