2

私は次のクエリを持っています:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              select e;

そして、すべてが機能し、機器を入手して、Manufacturersテーブルを正しく(熱心に)ロードします。しかし、次の多対多のクエリを実行しようとすると、次のようになります。

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              from cce in e.ContractEquipments
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;

ここで、「ContractEquipments」は「Equipments」と「Contracts」の間の多対多のルックアップですが、このクエリを実行すると、Manufacturersテーブルが簡単に読み込まれなくなります。次のことを行わずにこれを修正する方法についてのアイデア:

if (MyEntity.Manufacturers.IsLoaded == false) 
   MyEntity.ManufacturersReference.Load()

このプロジェクトの実行には何時間もかかります。データベース呼び出しの数を抑えたいと思います。

編集#1:

私もこれを試しましたが成功しませんでした:

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              join cce in ContractContext.ContractEquipments 
                on e.ID equals cce.Equipments.ID
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;
4

2 に答える 2

7

初期のインクルードは、いくつかのタイプのクエリ(つまり、追加の結合など)で失われることがよくあります

これを回避する方法は、クエリを実行することです(エンティティを返す場合、つまり、プロジェクションではなくeを選択する、つまり、新しい{...}を選択する)、ObjectQueryにキャストして、外側にインクルードを行うことができます。 :

var MyQuery = ((from e in ContractContext.Equipments
              where e.Customers.ID == customer.ID
              from cce in e.ContractEquipments
              where cce.Contracts.EndedOn >= DateTime.Today
              select e) as ObjectQuery<Equipment>).Include("Manufacturers");

これは機能するはずです。

これに関する詳細に興味がある場合は、ヒント22-インクルードを実際にインクルードにする方法を確認してください。

アレックス

于 2009-06-02T04:09:02.310 に答える
0

代わりにこのように参加してみましたか?

var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
              where e.Customers.ID == customer.ID
              join cce in e.ContractEquipments on e.Id equals cce.EquipmentId
              where cce.Contracts.EndedOn >= DateTime.Today
              select e;
于 2009-06-01T20:35:40.697 に答える