是的,这是我连续第四天问一个关于摘要的问题,对不起,我会试着去回答一些关于 SQLServer 的问题,以回馈社区。反正...
如何将 Linq 查询的结果投影到抽象基类集合中?这是我的 RecruiterBase 抽象类中的我的方法(还有一个相应的 CandidateBase 抽象类):
public IQueryable<CandidateBase> GetCandidates()
{
return from candidates in db.Candidates
where candidates.RecruiterId == this.RecruiterId
select candidates;
}
上述方法会抛出编译时错误,即无法在 Candidate 和 CandidateBase 之间进行隐式转换。
将 db.Candidates 修改为 db.Candidates.Cast() 可以编译所有内容,但我得到一个运行时错误,即在类型 Candidate 和 CandidateBase 之间未定义强制运算符。
我做不到:选择 New CandidateBase { ... } 作为 CandidateBase,因为无法实现抽象。
我也不能在候选人和候选人基础之间创建一个显式转换运算符,因为它再次要求我更新我的摘要
我也不能将我的结果投影到匿名对象中,然后转换为 CandidateBase,因为我在匿名类型和 CandidateBase 类型之间得到相同的运行时强制异常。
这个问题来自昨天的问题, Problem with Covariant return types from an abstract method
Stan R 提供的答案是我让事情变得复杂。我回去,简化了一切(我将实现留在基础中并将其从潜艇中删除)并最终实现了一个有效的 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 中时),这看起来很奇怪。如果从基本类型中引用子类型是可以的,请随意对我的问题投反对票。
谢谢。
全类定义:
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)
{
}
}