はい、これは私の四日目の抄録に関する質問です。申し訳ありませんが、私はSQLServerに関するいくつかの質問に答えて、コミュニティに好意を返すつもりです。とにかく...Linqの結果を抽象コンストラクタに投影するには?
Linqクエリの結果を抽象基本クラスコレクションに投影するにはどうすればよいですか?ここに私のRecruiterBase抽象クラスからの私の私の方法は、(対応するCandidateBase抽象クラスもある)である:
public IQueryable<CandidateBase> GetCandidates()
{
return from candidates in db.Candidates
where candidates.RecruiterId == this.RecruiterId
select candidates;
}
上記の方法は、暗黙的な変換が候補とCandidateBaseの間で行うことができないことを、コンパイル時にエラーがスローされます。
db.Candidates.Cast()にdb.Candidatesをコンパイルすると、すべてがコンパイルされますが、タイプがCandidateとCandidateBaseの間に強制演算子が定義されていないランタイムエラーが発生します。
私はできません:抽象を実装できないため、候補CandidateBase {...}を候補として選択してください。
また、それが再び私の抽象
アップ新しいに私を必要とするので、私は候補者と候補基地間の明示的な変換演算子を作成することができたり、私は匿名のオブジェクトに私の結果を予測し、私が得るようCandidateBaseにキャストすることができます匿名型とCandidateBase型との間の同じ実行時強制例外。
この問題はスタンRが提供する答えは、私は複雑に物事を作っていたということでした Problem with Covariant return types from an abstract method
、昨日の質問から生まれました。私は、戻って簡略化され、すべてを行ってきました(私はベースにimplmentationを残し、潜水艦からそれを削除)、そのように実装作業GetCanidates方式になってしまった:
public IQueryable<CandidateBase> GetCandidates()
{
return (from candidates in db.Candidates
where candidates.RecruiterId == this.RecruiterId
select new CandidateA
{
CandidateId = candidates.CandidateId,
LastName = candidates.LastName,
RecruiterId = candidates.RecruiterId
}).Cast<CandidateBase>();
}
上記の方法は、コンパイルと動作し、私は」口の中で贈り物の馬を見ようとしていませんが、今では私の基底型で(私はCandidateAに結果を投影すると)私のサブタイプへの参照があり、ちょっと変わっているようです。ベースタイプ内のサブタイプへの参照が大丈夫なら、私の質問に投票してください。
ありがとうございました。
全クラスDEFS:
public abstract class RecruiterBase
{
public int RecruiterId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public RecruiterBase()
{
}
public RecruiterBase(int id)
{
DataClasses1DataContext db = new DataClasses1DataContext();
Recruiter rc = db.Recruiters.SingleOrDefault(r => r.RecruiterId == id);
this.RecruiterId = rc.RecruiterId;
this.FirstName = rc.FirstName;
this.LastName = rc.LastName;
}
public IQueryable<CandidateBase> GetCandidates()
{
DataClasses1DataContext db = new DataClasses1DataContext();
return (from candidates in db.Candidates
where candidates.RecruiterId == this.RecruiterId
select new CandidateA
{
CandidateId = candidates.CandidateId,
LastName = candidates.LastName,
FirstName = candidates.FirstName,
RecruiterId = candidates.RecruiterId
}
).Cast<CandidateBase>();
}
}
public abstract class TempCandidateBase
{
public int CandidateId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? RecruiterId { get; set; }
public CandidateBase()
{
}
public CandidateBase(int id)
{
DataClasses1DataContext db = new DataClasses1DataContext();
Candidate candidate = db.Candidates.SingleOrDefault(c => c.CandidateId == id);
this.CandidateId = candidate.CandidateId;
this.FirstName = candidate.FirstName;
this.LastName = candidate.LastName;
this.RecruiterId = candidate.RecruiterId;
}
}
public class RecruiterA : RecruiterBase
{
public RecruiterA()
: base()
{
}
public RecruiterA(int id)
: base(id)
{
}
}
public class CandidateA : CandidateBase
{
public CandidateA()
: base()
{
}
public CandidateA(int id)
: base(id)
{
}
}
あなたは私たちに候補とCandidateBaseクラスだけでなく、実際の関連コンパイラエラーメッセージを表示してもらえますか? –
私は自分の投稿を瞬時に正確なクラスのdefで編集します。 –