1

すべてのリポジトリに実装される抽象クラスがあります。その中に、コレクションを返すプロパティがあります。

protected readonly IDbSet<T> _dbSet;

public virtual IEnumerable<T> GetSelection(Func<T, bool> where)
{
    return _dbSet.Where(where);
}

レポ:

public class PostcodeDataRepository : EntityRepositoryBase<PostcodeData>, IPostcodeDataRepository
{
    // Constructor in here
}

これでうまくいきます:

var postcodeData = postcodeRespoistory.GetSelection(x=>x.Postcode == "SW1A 2TT");

(はい、これは英国の郵便番号データです。はい、テーブルには 200 万行近くあります)

これはうまく機能しますが、私の問題は、アプリケーションがフィルタリングするためだけにすべてのデータを返し、パフォーマンスの問題を引き起こしていることです (ご想像のとおり!)。MiniProfiler と EFProf から使用して、select * from PostcodeData私がやりたいことではないことを効果的に実行していることを確認しました。

これを解決する方法はありますか?

4

1 に答える 1

4

Expression<Func<TSource, bool>>述語を使用する必要があります。

public IEnumerable<T> GetSelection(Expression<Func<T, Boolean>> predicate)
{
    return _dbSet.Where(where);
}
于 2013-04-09T13:30:09.443 に答える