2011-06-22 10 views
6

次のクエリは正常に動作しています。JsonResultを返すことができません

var tabs = (
       from r in db.TabMasters 
       orderby r.colID 
       select new { r.colID, r.FirstName, r.LastName }) 
       .Skip(rows * (page - 1)).Take(rows); 

は今、私は

var jsonData = new 
      { 
       total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
       page = page, 
       records = totalRecords, 
       rows = (from r in tabs 
         select new { id = r.colID, cell = new string[] { r.FirstName, r.LastName } }).ToArray() 
      }; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

等化するJsonResultを返すようにしたい。しかし、それ意志は次のように私にエラーを与える:「[]可能System.String」クエリ結果で初期化することはできません アレイタイプ。代わりに 'System.Collections.Generic.List`1 [System.String]'を使用することを検討してください。

予期した結果を得るにはどうすればよいですか?

答えて

8

私はそれがAsEnumerable()を使用して、処理中のクエリに最後の部分を押すのと同じくらい簡単だと思われる:

var jsonData = new 
{ 
    total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
    page = page, 
    records = totalRecords, 
    rows = (from r in tabs.AsEnumerable() 
      select new { id = r.colID, 
         cell = new[] { r.FirstName, r.LastName } } 
      ).ToArray() 
}; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

あなたは明確にするため、匿名型の初期化子のうち、そのクエリを引っ張っすることもできます。

var rows = tabs.AsEnumerable() 
       .Select(r => new { id = r.colID, 
            cell = new[] { r.FirstName, r.LastName }) 
       .ToArray(); 

var jsonData = new { 
    total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
    page, 
    records = totalRecords, 
    rows 
}; 
+1

優れたソリューション...! – imdadhusen

+0

[並べ替えがSIDXとOrderTypeが ( ORDERBYは、新しい{r.colID、r.FirstName、r.LastName}を選択r.colID db.TabMastersにrから )クエリ 'VARタブ=次のSORDされる使用方法。 Take(rows *(page - 1))。Take(rows); ' ** orderby r.colIDをsidxに置き換えたい、または '** ** – imdadhusen

+0

@imdadhusen:あなたが意味することは本当に明白ではありませんしかし、それは別の質問として尋ねられるほうがよいようです。 –

1

これは、LINQクエリにtabs IQueryableを追加するためです。つまり、LINQ式をSQLクエリに変換しようとしていて、プロバイダーは配列の投影をサポートしていません。

ToListを使用してDB結果をマテリアライズするタブ変数のLINQ式の割り当てを変更するか、匿名型のrowsフィールドに割り当てられたLINQ式に.AsEnumerable()を追加することができますそれはあなたのJsonResultです。 AsEnumerableはIQueryableをIEnumerableに降格させます。これにより、2番目のLINQクエリがDBクエリに追加されるのを防ぎ、LINQからオブジェクトへの呼び出しを必要とするようにします。

関連する問題