2012-04-15 27 views
9

なぜこれが動作しないのか疑問に思った過去2日間は過ごしましたが、他のテーブルでは正常に動作しています。私は多くのフィールドを含む私の他のモデルをテストしました。この2つのフィールドだけを使用しても、この特定のフィールドは機能しません。私は明らかな部分がないかもしれないことを知っている、助けてください。ここで指定された型メンバーは、LINQ to Entitiesではサポートされていません。イニシャライザ、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています

は私のモデルの

public class ReceivedItem 
{   
    public int ReceivedItemID { get; set; } 
    public int ItemID { get; set; } 
} 

のViewModel

public class ReceivedItemViewModel 
{ 
    public int ReceivedItemID { get; set; } 
    public int ItemID { get; set; } 
} 

コントローラ

[GridAction] 
public ActionResult GetReceivedItems() 
    { 
     return View(new GridModel(GetReceivedItemsViewModels())); 
    } 

private IQueryable<ReceivedItemViewModel> GetReceivedItemsViewModels() 
{ 
    return db.ReceivedItems 
     .Select(
      c => new ReceivedItemViewModel 
      { 
       ItemID = c.ItemID 
      }); 
} 

ビュー

@(Html.Telerik().Grid<ReceivedItem>() 
.Name("grdItems") 
.DataBinding(binding => binding.Ajax() 
    .Select("GetReceivedItems", "Receiving")) 
.DataKeys(keys => keys.Add(o => o.ItemID)) 
.Columns(cols => 
{ 
    cols.Bound(c => c.ItemID); 
}) 
.Pageable() 
.Sortable() 
.Groupable() 
.Filterable() 

私は放火犯を使用してしまったエラー:

The specified type member 'ReceivedItemID' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 
+0

それを例外の発生場所を知るのに役立ちます。この例外は、通常、 'Where(a => a.Parent == parentObject)'のようにプリミティブ値が必要なエンティティを使用することを示します。 ( 'どこで(a => a.ParentId == parentId)')でなければなりません。 –

答えて

11

私が知っているから、あなたは、LINQのツーSQLクエリで非エンティティオブジェクトを初期化することはできません。結果を列挙してから、Linqを使ってビューモデルを作成してみてください。

// Original Code 
return db.ReceivedItems 
    .Select(
     c => new ReceivedItemViewModel 
     { 
      ItemID = c.ItemID 
     }); 

列挙し、あなたのビューモデルを作成するためのLINQを使用して::

// First statement 
var items = db.ReceivedItems.ToArray(); // Enumerates the collection. 
// Second statement 
return items.Select(
    c => new ReceivedItemViewModel 
    { 
     ItemID = c.ItemID 
    }); 

最初のLINQのは、あなたが持っているもの

(例外がスローされている場合、私はこれを推測しているです)ステートメントがSQLステートメントに変換され、結果が返されて配列として列挙され、最後に2番目のステートメントでその配列がビューモデルのコレクションを作成するために使用されます。元のステートメントでは、LinqステートメントのSQL変換は、ビューモデル(これを行うことはできません)を考慮する必要があります。

こちらがお役に立てば幸いです。 (そして意味をなさない):

2

Telerikの剣道のグリッドを使ってこの問題に遭遇したので、私はこの問題が実際にTelerikに由来していると信じています。ビューモデルへの投影(選択内)は、例外の実際の原因ではありませんでした。

参照される列 "ReceivedItemID"が投影にマップされていないことに注意してください。不足しているプロパティを割り当てるだけで問題は解決しました。私の場合は

return db.ReceivedItems 
    .Select(
     c => new ReceivedItemViewModel 
     { 
      ReceivedItemID = c.ReceivedItemID 
      ItemID = c.ItemID 
     }); 

、モデルがして、実行された追加のステップがありました:

return Json(model.ToDataSourceResult(request)); 

はTelerik ToDataSourceRequest拡張メソッドは、SQLクエリを変更し、それが混乱してきました。お使いのコントローラのコードで

0

、あなたはそれあなたがより多くのここを参照してください、あなたのコレクションのためIEnumerableを使用していないことを確認するために、対話型

[GridAction] 
public ActionResult GetReceivedItems([DataSourceRequest] DataSourceRequest request) 
    { 
     return Json(db.ReceivedItems.AsEnumerable().Select(x => x).ToDataSourceResult(request)); 
    } 
関連する問題