2

残念ながら、システムに何百万ものレコードが蓄積されたときに何が起こるかを考慮していないシステムを維持しています。

私が抱えている問題は、主に GetList メソッドが実際にデータベースからすべてのレコードを返し、getfull メソッドでフィルタリングが行われるコードの現在の書き方です。

調整のIDをgetlistメソッドに渡してこれを変更しようとしましたが、実行しようとすると.Where(a => a.Id == journalid)このエラーが発生します

タイプ「System.Linq.IQueryable」を「System.Data.Objects.ObjectQuery」に暗黙的に変換することはできません

public Adjustment GetFull(int id) {
            var result = GetList(id).FirstOrDefault(ja => ja.Id == id);
            if(result == null) {
                throw new InvalidOperationException(
                    String.Format(" Adjustment with Id={0} not found.", id)
                );
            }
            return LoadFullActivities(result);
        }


        private IQueryable<Adjustment> GetList(int journalid) {
            return GetList(journalid,"Original", "Activities",
                "Original.Employee", "Original.Employee.EmployeeType", 
                "Original.Employee.WorkType", "Original.Employee.Department", 
                "Original.Activities", "Original.Status", 
                "Original.Approver", "Status");
        }

        private IQueryable<Adjustment> GetList(int journalid, params string[] includes) {
            var tempResult = dataContext.AdjustmentSet;
            foreach (var property in includes) {
                tempResult = tempResult.Include(property).Where(a=>a.Id == journalid) ;
            }
            return tempResult;
        }
4

1 に答える 1

5

これにより、エラーが修正されます

private IQueryable<Adjustment> GetList(int journalid, params string[] includes) {
         var tempResult = dataContext.AdjustmentSet.AsQueryable();
         foreach (var property in includes) {
              tempResult = ((ObjectQuery<Adjustment>)tempResult).Include(property);
         }            
         return tempResult.Where(a=>a.Id == journalid);
      }

これらのインクルードは、クエリの速度を低下させます。クエリは 1 つの行のみを取得するため (インクルードのために他の結合を行うため)、パフォーマンスがそれほど遅くなるとは思いません。パフォーマンスを向上させるには、外部キーごとにインデックスを追加します。a.Id には既にクラスター化インデックスがあると思います。

于 2012-04-25T16:54:07.190 に答える