5


1

エンティティへのリンク - EntityCollectionナビゲーションプロパティでの検索

クラスがあります

public Invoice: EntityObject
{
    public EntityCollection Positions { get {...}; set{...}; }
    ...
}

public InvoicePosition: EntityObject
{
    public string GroupName { get {...}; set{...}; }
}

私たちには「IQueryable」が与えられていますが、「IQueryable」は与えられていません。 GroupNameが 'Fuel’のポジションを持つ請求書をどのように検索すればよいですか?

IQueryable invoices = InvoiceRepository.List();
IQueryable invoicesThatHaveFuelPositions =
    from i in invoices
    where ?
    select i

EntityFrameworkはそれを適切なSQLクエリに変換できるはずです。

編集

Mark Seemannが書いたように、私は使うことができます:

IQueryable invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable invoicesThatHaveFuelPositions =
    from i in invoices
    from p in i.Positions
    where p.GroupName = 'Fuel'
    select i;

問題があります。 このフィルタリングを使用すると、 "OtherInclude"がなくなります。 EFを使用する場合、これは適切なフィルタリング方法ではないと思います。 私はそれをに変更する必要があります:

IQueryable invoices = InvoiceRepository.List().Include("Positions").Include("OtherInclude");
IQueryable invoicesThatHaveFuelPositions = invoices.Where(???);

しかし、Whereには何を書くべきですか。

編集

インクルード( "ポジション")をインクルード( "ポジション")に変更しました。

編集

Alex Jamesがヒント(http://blogs.msdn.com/alexj/archive/2009/06/02/tip-22-how-to-make-include-really-include.aspx)へのリンクを提供しました。

IQueryable invoicesThatHaveFuelPositions =
    from i in invoices
    where i.Positions.Any(p => p.GroupName == 'Fuel')
    select i;

それはうまくいくようで、EFインクルードには影響しません。

2 Answer


5


マークに基づいて答えます。 あなたがこれをするならば:

var q =請求書のiから。i.Positionのpのp(GroupName == "Fuel"にiを含める。

インクルードは失われます( this tipを参照)。クエリの形状が変更されると、EFはすべてのインクルードを失います。たとえば、from fromというSelectManyクエリのように暗黙的な結合を行う場合などです。

この問題を回避するには、クエリを記述してから最後にIncludeを適用します。

このようなもの:

var q =((iからi.Positionsのpからの請求書の中で、p.GroupName == "Fuel"を選択すると、ObjectQueryとしてi)が選択されます).Include( "something");

これを行うと、Entity Frameworkが実際にインクルードを行います。

お役に立てれば

アレックス


2


このような何かが動作するはずです:

var q = from i in invoices
        from p in i.Positions
        where p.GroupName == "Fuel"
        select i;

ただし、これはナビゲーションプロパティ `Positions`を使用します。デフォルトではロードされません(Entity Frameworkは明示的なロードを使用します)。 しかし、 `invoices`変数が次のように作成されていればうまくいきます。

var invoices = from i in myObjectContext.Invoices.Include("Positions")
               select i;