4

現在、完全な汎用リポジトリがありますが、1つの機能がありません。それは、 Include()Find()一緒に使用することです。

だから今私は持っています:

public E FindById<E>(int id) where E : class
{
    return DataContext.Set<E>().Find(id);
}

を使用して呼び出されます

var person = PersonRepo.FindById<Person>(personId);

私は次のようなものが欲しいです:

var person = PersonRepo.FindByIdWithIncludes<Person>(personId,new[]{"State.Address"});

したがって、この線に沿った何か(これは単なるテストです):

public E FindByIdWithIncludes<E>(int id, string[] includes) where E : class
{
    var entitySet = DataContext.Set<E>();
    DbQuery<E> entityQuery;

    foreach (var include in includes)
    {
        entityQuery = entitySet.Include(include);
    }

    return entityQuery.Find(id); //this is were it breaks
}

出来ますか?

4

2 に答える 2

9

Find直接使用することはできません-Findインクルードでは機能しません。を使用する必要がありますSingleOrDefault

まず、エンティティがキーを公開するためのインターフェイスを定義する必要があります。

public interface IEntityWithId 
{
    public int Id { get; set; }
}

次に、キーにアクセスするための制約付きの簡単なメソッドを記述できます。

public E FindByIdWithIncludes<E>(int id, string[] includes) 
    where E : class, IEntityWithId
{          

    IQueryable<E> entityQuery = DataContext.Set<E>();

    foreach (var include in includes)
    {
            entityQuery = entityQuery.Include(include);
    }

    return entityQuery.SingleOrDefault(e => e.Id == id); 
}

ところで。強く型付けされたインクルードを使用できます-これが例です。

于 2012-07-26T08:22:53.080 に答える
1

逆に使用して、を使用することもできますFindが、と組み合わせて使用​​できLoadます。場合によっては、よりもパフォーマンスが優れている場合がありますInclude-SingleOrDefaultが、実際にはシナリオによって異なります。

非一般的な例:

 private User GetByUID(int uID, bool includeDetails = false, bool includeAddresses = false)
 {
    var result = context.Users.Find(uID);
    if (includeDetails)
    {
       // load user-details (1:1 relation)
       context.Entry(result)
              .Reference<UserDetails>(us => us.UserDetails)
              .Load();
    }
    if (includeAddresses) 
    {
       // load user-addresses (1:m relation)
       context.Entry(result)
              .Collection(us => us.Addresses)
              .Load();    
    }
    return result;
 }

それをあなたのニーズに一般的にすることは難しいことではありません。

于 2014-03-21T13:40:45.797 に答える