1

私はEF5を使用しており、次のようなインクルードプロパティを受け取ることができるGetByIdメソッドを備えた汎用リポジトリがあります。

public virtual T GetByIdIncluding(long id, params Expression<Func<T, object>>[] includeProperties)
{
    IQueryable  <T> query = DbContext.Set<T>().Find(id) as IQueryable<T>;

    foreach (var includeProperty in includeProperties)
    {
        query = query.Include(includeProperty);
    }

    return query.FirstOrDefault();
}

DbContext.Set<T>().Find(id)正しいオブジェクトを返しますが、IQueryableとしてキャストすると、変数queryの値はnullになります。

なんで?Idがパラメーターによって送信されたエンティティとすべてのインクルードがパラメーターによって送信されたエンティティのみを選択するにはどうすればよいですか?

使用例:

var houses = Uow.Types.GetByIdIncluding(id, tt => tt.Houses);

前もって感謝します!ギレルモ

4

3 に答える 3

1

DbContext.Set<T>().Find(id)単一のエンティティを返します。

IQueryable<T>ですDbContext.Set<T>()


IDで単一のエンティティを選択した後は、一部のプロパティを含めることができません。DbSet<T>.Findまた、いくつかのプロパティを含めた後は、結果がになるため、使用できませんIQueryable<T>。できること-プロパティを含め、後でIDで結果をフィルタリングします。

public static IQueryable<T> Including(
                          params Expression<Func<T, object>>[] includeProperties)
{            
    IQueryable<T> query = DbContext.Set<T>();

    foreach (var includeProperty in includeProperties)    
        query = query.Include(includeProperty);    

    return query;
}

以降:

var types = Uow.Types.Including(tt => tt.Houses)
                     .SingleOrDefault(tt => tt.Id == id);

GetByIdIncludingまた、(ジェネリックリポジトリではなく)具象リポジトリクラスにメソッドを作成することもできます。

public static Foo GetByIdIncluding(long id, 
                 params Expression<Func<Foo, object>>[] includeProperties)
{
    return Including(includeProperties).SingleOrDefault(f => f.Id == id);
}

ところで、遅延読み込みの使用を検討してください(デフォルトで有効になっています)。

于 2012-11-16T21:52:47.400 に答える
0

http://msdn.microsoft.com/en-us/library/gg696418%28v=vs.103%29.aspx DbSet.Findメソッドは、エンティティではなくエンティティを返しIQueryableます。Setメソッドを呼び出す前に、インクルードを設定してみてくださいFind

于 2012-11-16T21:54:50.410 に答える
-1

Findループの後にに移動する必要があります。

public virtual T GetByIdIncluding(long id, params Expression<Func<T, object>>[] includeProperties)
{
    var query = DbContext.Set<T>();

     foreach (var includeProperty in includeProperties)
     {
         query = query.Include(includeProperty);
     }

    return query.Find(id);
}
于 2012-11-16T22:01:21.043 に答える