我正在尝试通过传入需要水合的子对象的表达式来在存储库中实现一种急切加载功能。
Candidate Get(int candidateId, params Expression<Func<Candidate, object>>[] includes);
所以我的服务可以这样调用:
candidateRepository.Get(1, p => p.Notes, p => p.Profile, p => p.Application);
其中 Notes、Profile 和 Application 都是 Candidate 的属性。像这样的东西:
public class Candidate
{
public string Name { get; set; }
public IList<CandidateNote> Notes { get; set; }
public Profile Profile { get; set; }
public Application Application { get; set; }
}
因此,在存储库中,我需要确定是否将属性传递到表达式参数中以实际尝试对其进行水合。但我没有看到一种优雅的方式来实现这一目标。
public Candidate Get(int candidateId, params Func<Candidate, object>[] includes)
{
...
if (candidate.Notes property was specified?)
{
candidate.Notes = this.candidateNoteRepository.List(candidateId);
}
return candidate;
}
看起来我可以通过表达式从表达式中获取属性名称(includes[0].Body as MemberExpression).Member.Name
,但似乎应该有更简单的方法。另外,我不喜欢字符串比较。我真的不想这样做,除非我必须:
if (includes[0].Body as MemberExpression).Member.Name == "Notes")
{
看起来它应该是非常简单的东西
if (includes[0].Is(candidate.Notes) or includes[0](candidate.Notes).Match())
{
万一它出现,我非常希望将包含作为表达式数组保留,因为尽管我今天正在使用 ADO.NET,但我们计划最终走实体框架的道路,这些表达式将很好地工作使用 Include 方法。
return this.Filter(m => m.Candidates.CandiateId == candidateId)
.Include(includes[0])