14

私はEF 5で次のものを持っています:

var a = context.Posts.Include(x => x.Pack).Select(x => x.Pack.Id).ToList();

これは機能します。次に、これを汎用リポジトリに複製しようとしました。

public IQueryable<T> Include<T>(Expression<Func<T, Boolean>> criteria) where T : class
{
    return _context.Set<T>().Include(criteria);
}

しかし、この場合、私は次のことを行うことができません:

var b = repository.Include<Post>(x => x.Pack).Select(x => x.Pack.Id).ToList();

エラーが発生します:

タイプ 'Data.Entities.Pack' を 'bool' に暗黙的に変換することはできません

どうすればこれを解決できますか?

Include() メソッドで何を変更すればよいですか?

4

3 に答える 3

16

試す:

変化する

Expression<Func<T, Boolean>> criteria

Expression<Func<T, object>> criteria

編集: 複数のエンティティを含めるには、「include」拡張機能を追加する必要があります。

public static class IncludeExtension
{
    public static IQueryable<TEntity> Include<TEntity>(this IDbSet<TEntity> dbSet,
                                            params Expression<Func<TEntity, object>>[] includes)
                                            where TEntity : class
    {
        IQueryable<TEntity> query = null;
        foreach (var include in includes)
        {
            query = dbSet.Include(include);
        }

        return query == null ? dbSet : query;
    }
}

次に、次のように使用できます。

repository.Include(x => x.Pack, x => x.Pack.Roles, ...).Select(x => x.Pack.Id).ToList();

「リポジトリ」が「DbSet」オブジェクトを返すことを確認してください。

于 2012-12-11T02:05:31.457 に答える
0

これは、EF 6 で行って終了したことです。

 public IEnumerable<T> GetIncludes(params Expression<Func<T, Object>>[] includes)
        {
            IQueryable<T> query = table.Include(includes[0]);
            foreach (var include in includes.Skip(1))
            {
                query = query.Include(include);
            }               
            return query.ToList();
        }
于 2018-05-08T00:26:50.340 に答える