2016-04-02 10 views
0

私は次のlinqクエリを持っています。私は年と月ごとにグループ化していくつかの計算を行います。ViewModelがセットアップされています。コンパイルができないため、クエリが期待どおりに機能するかどうかはわかりません。私はそうのような方法SummaryYrMnを起動してみてくださいマルチとlinqのグループと年と月を結ぶ

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 

コントローラーコード

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

[System.Linq.Enumerable](https://msdn.microsoft.com/en-us/library/system.linq.enumerable(v = vs.100).aspx)でないはずですか? Enumerable.Range()を完全修飾してみてください。 –

+0

あなたの提案をまだ使用していません。あなたはこれを別のやり方でしたでしょうか? – Diin

+0

ああ、そうです。そうですか。これはエンティティへのLinqです!はい。あなたの年と月ごとに変数を作成し、それらにEnumerable.Rangeを割り当てます。あなたのlinqのそれらを使用してください。 EFはlinqからsqlを生成しようとしています。Enumerable.RangeはSQL関数ではありません。それは理にかなっていますか? –

答えて

0

をこのエラーが出る...

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 } 
... 

Enumarable.Rangeは、()でSQLに翻訳されていますLinq-to-Entitiesであり、SQLコンテキストには存在しません。