テーブルに次の列があります
- Id(int)
- 名前(nvarchar)は通常100文字未満
- データ(nvarchar)平均1MB
各行を調べて、[名前]フィールドに対していくつかの操作を実行するプログラムを作成しています。Nameフィールドのみを使用していて、Dataフィールドが非常に大きいので、IdとNameフィールドのみをロードするようにEFに指示することはできますか?
テーブルに次の列があります
各行を調べて、[名前]フィールドに対していくつかの操作を実行するプログラムを作成しています。Nameフィールドのみを使用していて、Dataフィールドが非常に大きいので、IdとNameフィールドのみをロードするようにEFに指示することはできますか?
確かに
ctx.YourDbSet.Select(p=> new { Id = p.Id, Name = p.Name});
このメソッドは匿名クラスを選択しています。
これをもう一度保存したい場合は、ダミーエンティティと呼ぶものを使用してこれを行うことができます。
foreach(var thing in ctx.YourDbSet.Select(p=> new { Id = p.Id, Name = p.Name}))
{
var dummy = new YourEntity{Id = thing.Id};
ctx.YourDbSet.Attach(dummy);
dummy.Name = thing.Name + "_";
}
ctx.SaveChanges();
EFは、updateステートメントで送り返すためのattach呼び出しの後に行われた変更のみを追跡するため、このメソッドはスナップショット追跡で機能します。これは、クエリにそのエンティティのnameプロパティの更新のみが含まれることを意味します(つまり、データにアクセスしません)
注:EFトラッキンググラフに既にアタッチされているオブジェクトをアタッチできないため、厳密に制御するコンテキストでこれを実行する必要があります。上記の場合、selectはエンティティを匿名としてグラフに添付しません(したがって、同じコンテキストを使用しても安全です)