2016-04-02 4 views
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(); 
    } 
+0

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(). –

+0

Ne fonctionne toujours pas avec votre suggestion. Auriez-vous fait cela d'une manière différente? – Diin

+0

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? –

Répondre

0

Essayez de commencer la méthode SummaryYrMn comme si ...

var yrs = Enumerable.Range(2010, DateTime.Today.Year); 
var months = Enumerable.Range(1, 12);  
var squery = 
     (from bk in db.Books 
     from year in yrs 
     from month in months 
     let key = new { Year = year, Month = month } 
... 

Le Enumarable.Range() est en cours de traduction en SQL par le Linq-to-Entities et n'existe pas dans un contexte sql.