1

ここに私が試したことの束があります...うまくいけば、私がやろうとしていることと私が間違っていることを推測できます。さて、この DoQuery を使用すると、関連するエンティティの読み込みに問題が発生します。

   public ObjectQuery<E> DoQuery(ISpecification<E> where)
   {
        return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Where(where.EvalPredicate);
   }

これをそのまま使用すると、関連するエンティティを除くすべての適切なパラメータを含むオブジェクトが返されます...つまり。1 つが User テーブルを参照する UserID である場合、User オブジェクトも返されません。

.Include("User") を実行してエンティティの Eager Load を実行できることを読みましたが、これを試しても機能しません。

public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
     return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "]").Include("User").Where(where.EvalPredicate);
}

また、エンティティ セット名とモデル名が「ユーザー」であることを確認しました。他に考えられる唯一のことは、に複数のものを入れること("[" + typeof(E).Name + "]")ですが、そこに複数のエンティティを含める方法がわかりません... . 間に。

public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
     return (ObjectQuery<E>)_ctx.CreateQuery<E>("[" + typeof(E).Name + "].[User]").Where(where.EvalPredicate);
}

しかし、それはうまくいきませんでした...

私が正しい軌道に乗っていない場合は、お知らせください。ObjectContext.CreateQuery を使用するときに関連エンティティを読み込む方法を知っている人はいますか? 提案や洞察が役立ちます。

ありがとう、
マット

4

2 に答える 2

3

CreateQuery は ESQL ステートメントを取ります。したがって、次のように書くことができます。

public ObjectQuery<E> DoQuery(ISpecification<E> where)
{
    var esql = String.Concat(
         "SELECT VALUE e1 FROM OFTYPE(", 
         GetEntitySetName(typeof(E)),
         ", ", 
         typeof(T).FullName, 
         ") AS e1");
    return Context.CreateQuery<T>(esql).Include("User").Where(where.EvalPredicate);
}

...ここで、GetEntitySetName は、エンティティ タイプの文字列エンティティ セット名を返す、または熱心な読み込み戦略を使用する、作成するメソッドです。

OFTYPE の理由 モデルに継承がある場合、この ESQL は継承がない場合ObjectQuery<TParent>ではObjectQuery<TChild>なく返されます。

最後に、Includeエンティティ E に User という名前のプロパティがある場合にのみ機能します。タイプとエンティティ セット名は とは関係ありませんInclude

于 2009-11-02T13:43:51.547 に答える
1

コメントでクレイグが指摘したように、この回答の以前のリビジョンは正しくありません。この回答を削除することはできないので (コメントのため?)、少なくとも間違っていないものを残そうとします。

Product と ProductDetail の 2 つのエンティティを持つモデル (.edmx) があるとします。さらに、特定の製品とその関連詳細を取得したいとします。

以下が機能することを確認します (詳細レコードを持つ ID が 1 の製品がある場合)。

var result = ctx.CreateQuery<Product>("Products").Include("ProductDetails").Where(p => p.ProductId == 1);

上記の Include ステートメントで、「ProductDetails」は Product のプロパティです。それが機能する場合は、次のことを試します。

public ObjectQuery DoQuery<E>(Expression<Func<E, bool>> filter)
{
    string entitySetName = GetEntitySetName(typeof(T)); 
    return (ObjectQuery<E>)_ctx.CreateQuery<E>(entitySetName).Include("ProductDetails").Where(filter);
}

GetEntitySetName() は組み込み関数ではないことに注意してください

var result = DoQuery<Product>(p => p.ProductId == 1);
于 2009-10-31T20:06:50.727 に答える