私は1つの巨大な列を持つデータベーステーブルImageを持っています: Data。
その 1 つの列を遅延読み込みしたいので、すべての画像のリストを取得するときにすべてを照会する必要はありません。
次のように、データを独自の列とエンティティに入れることができることを知っています。
しかし、私はしなければなりませんか?
私は1つの巨大な列を持つデータベーステーブルImageを持っています: Data。
その 1 つの列を遅延読み込みしたいので、すべての画像のリストを取得するときにすべてを照会する必要はありません。
次のように、データを独自の列とエンティティに入れることができることを知っています。
しかし、私はしなければなりませんか?
はい、そうしなければならないと思います。EFでは不可能だと思います。
必要な列に対して明示的なクエリを作成し、後でデータ列に対してクエリを実行できます。この投稿の提案のように:
ADO.NET Entity Frameworkで必要な場合にのみvarbinary(max)フィールドをロードする方法は?
しかし、Linq To SQL がその可能性を提供しているように見えるので、EF にも来るかどうかを調べてみます。
データスキーマにアクセスできますか? Entity Framework では、同じテーブルを参照する 2 つのエンティティを使用することはできません。**少なくとも以前はできませんでした。とは言うものの。データ列を使用して Sql VIEW を作成できます。
CREATE VIEW [dbo].[ImageData]
SELECT
Id,
Data
FROM Image
これで、上記のスキーマを反映するイメージ データと呼ばれるエンティティを作成できます。
ビューを更新する必要がある場合は、それも可能です。ビューに INSTEAD OF TRIGGER というトリガーを作成するだけです。
-- INSERT Trigger
CREATE TRIGGER [dbo].[TR_ImageData_Update] ON [ImageData]
INSTEAD OF INSERT
AS
BEGIN
UPDATE [Image]
SET Data = i.Data
FROM Inserted AS i
END;
GO
これは、ほとんどの場合、おそらく理想的です。ただし、データベース スキーマにアクセスできない場合は、これを実行できない可能性があります。代わりに、イメージ エンティティから既定のクエリを作成します。
public static IQueryable GetImages(this DbContext db)
{
var query = db.Images.AsQueryable();
return query.Select(r => new Image() { Id = r.id....});
}
public static IQueryable GetImageData(this DbContext db, int imageId)
{
var query = db.Images.AsQueryable();
query = query.Where(x => x.Id == imageId);
query = query.Select(x => new ImageData() { Id = r.Id, Data = r.Data });
return query;
}