0
J'ai les requêtes linq suivantes et mon but est de regrouper par année et mois et faire quelques calculs: J'ai un ViewModel mis en place. Je ne suis même pas sûr si ma requête fonctionnera comme prévu, car il ne peut pas compiler. Je reçois cette erreurmulti joint linq et groupe par année et par mois
System.NotSupportedException was unhandled by user code
HResult=-2146233067
Message=LINQ to Entities does not recognize the method 'System.Collections.Generic.IEnumerable`1[System.Int32] Range(Int32, Int32)' method, and this method cannot be translated into a store expression.
Source=EntityFramework
Code contrôleur
public ActionResult Summary(int? yr, int? mn, int? BkId)
{
var squery = SummaryYrMn(yr, mn, BkId);
return View(squery);
}
public IEnumerable SummaryYrMn()
{
var squery =
(from bk in db.Books
from year in Enumerable.Range(2010, DateTime.Today.Year)
from month in Enumerable.Range(1, 12)
let key = new { Year = year, Month = month }
//sold books
join tr in db.Transacts.Where(a => a.TransactTypeId==1 && a.Book.BookTypeId==1) on key
equals new{tr.TransactDate.Year, tr.TransactDate.Month} into s
//gifted books
join tr2 in db.Transacts.Where(a => a.TransactTypeId == 2 && a.Book.BookTypeId == 1) on key
equals new{tr2.TransactDate.Year, tr2.TransactDate.Month} into t
//gifted tracts books book type = tract
join tr3 in db.Transacts.Where(a => a.TransactTypeId == 2 && a.Book.BookTypeId == 2) on key
equals new { tr3.TransactDate.Year, tr3.TransactDate.Month } into u
select new SummaryViewModel
{
Year = year,
Month = month,
Gifted = (int?)t.Sum(c => c.TransactQty) ?? 0,
GSales = (int?)s.Sum(c => c.TransactQty) ?? 0,
GiftedTracts = (int?)u.Sum(c => c.TransactQty) ?? 0,
TotalGift = ((int?)t.Sum(c => c.Book.BookPrice))*((int?)s.Sum(c => c.TransactQty)??0),
TotalSale = ((int?)s.Sum(c => c.TransactPrice))*((int?)s.Sum(c => c.TransactQty)??0)
});
return squery.AsEnumerable();
}
Cela ne devrait-il pas être [System.Linq.Enumerable] (https://msdn.microsoft.com/en-us/library/system.linq.enumerable (v = vs.100) .aspx)? Essayez de qualifier complètement votre Enumerable.Range(). –
Ne fonctionne toujours pas avec votre suggestion. Auriez-vous fait cela d'une manière différente? – Diin
Ah oui. Je vois. C'est Linq aux entités! Oui. Créez une variable pour chacun de vos année et mois, attribuez-leur l'Enumerable.Range. Ensuite, utilisez ceux de votre linq. EF essaie de générer sql à partir de votre linq et Enumerable.Range n'est pas une fonction sql. Cela a-t-il du sens? –