これについては、いくつかの方法があります。手元にある問題は.ToList()です。 db.XXXだけであれば、Enumerableを取得します.Enumerableは、列挙されるまで、DBからデータを取得するための一連の命令です。一度あなたが.ToList()を呼ぶと、それは実際に行き、DBからデータを取得します。これは時間がかかります。
私の意見では、大量のデータを持つフィールド以外のすべてのフィールドを含むViewModelを定義するのが最善の方法です。
public class ViewModel
{
public ViewModel(){}
public int Id {get;set;}
public string OtherData {get;set;}
}
ようにビュー機能の外 db.XXXを移動
:
var initialDBObject = db.XXX;
をそこからあなたはまだあなたのDBからのデータにアクセスするための命令セットだけである(あなたの可算を取ることができます)及びそのようなあなたのViewModelオブジェクトにそれを選択します:あなたはLINQの後ろに生成するクエリを変更している。ここで何が起こっている
var viewModelObject = initialDBObject.Select(x=> new ViewModel
{
Id = x.Id;
OtherData = x.OtherData;
//do not add the large column of data to the ViewModel
});
)((ToListメソッドを呼び出す前)テーブルXXXからデータを取得するためのシーン(この行にブレークポイントを置き、initialDBObjectにカーソルを置くと、生成されるSQLが表示されます)。 ToList()を呼び出すと、クエリはテーブルXXXからデータを取得するだけでなく、データを取得して、.emmファイルで定義されているように、ViewModelオブジェクト(XXXオブジェクトではなく)に挿入します。
また
.Select(x=> new
{
Id,
OtherData
});
と匿名のオブジェクトを作成しますが、ビューで動作するように匿名のオブジェクトを取得することは少し複雑であることができます。
次に、あなたではなく、元のDBオブジェクトのビューモデルを使用するようにインデックス表示ページを更新するために、あなたが好きそれを渡すことができます必要があります。
View(viewModelObject.ToList());
名前かかわらViewModelに、ほかのViewModel何か。 [DBテーブル名] ViewModelまたは同様のもの。
DBに多くの行がある場合は、すべてのデータをロードするのにまだ時間がかかります。この場合、ページングを調べる必要があります。
ToList()には問題はありません。ToList()は、ToList()の呼び出しによって発生しました。プログラム内のその時点でプログラムがデータベースにアクセスしているため、データを取得するために生成されたクエリ。テーブル全体のデータをToList()しようとしている場合、またはあなたの場合のように、膨大なデータを含む列を持つと、時間がかかるか、メモリ不足になる可能性があります。
.Select()に含める必要がある15個の列については、それは迷惑です。残念ながら、linq文でコンストラクタを使用することはできません。したがって、各列には強制的に値が設定されます。
ViewModelを定義するもう1つの方法は、.edmxデザインサーフェスを開き、背景を右クリックし、[新規作成 - >エンティティ]をクリックすることです。テーブルXXXをベースとして使用したり、XXXViewModelなどの別の名前を付けたり、大量のデータを含む列を削除したりすることができます。次に、db.XXXViewModel.ToList()を実行するだけです。
エンティティからフィールドを削除する場合は、モデルのエンティティ全体ではなく、そのフィールドをエンティティから削除します。 – Antrim
フィールドにIgnore Attributeを追加すると、EFはクエリでそれを使用したり、データでデータを入力したりしません。 –
あなたの質問に答えることはできません。おそらく何の助けにもなりませんが、カスタムモデルが必要な場合は、まずDBをやっていますか?これは、コードの第1のアプローチで容易に達成可能である。 – Omeed