This seems like a simple problem but I have been having a challenge loading a document via the entity with related document with Marten documentDB on postgres for the past 2 days. I’m also using the latest release of the library (7.26.0). Please patiently go through my work so far:
KycVerificationStep (Entity)
public class KycVerificationStep : BaseEntity
{
public Guid Id { get; set; }
public string Code { get; private set; }
public string Name { get; set; }
public string Description { get; private set; }
public string Icon { get; private set; }
public int Order { get; private set; }
public DateTimeOffset DateCreated { get; private set; }
public DateTimeOffset? DateUpdated { get; private set; }
private KycVerificationStep() { }
private KycVerificationStep(
string name,
string description,
string icon,
int order,
IKycVerificationStepDomainService domainService)
{
CheckRule(new KycStepMustBeUniqueRule(domainService, name));
Name = name;
Description = description;
Icon = icon;
Order = order;
DateCreated = SystemClock.Now;
Code = $"Step {Order}";
AddDomainEvent(new KycVerificationStepCreatedDomainEvent(Id));
}
public static KycVerificationStep Create(
string name,
string description,
string icon,
int order,
IKycVerificationStepDomainService domainService)
{
return new KycVerificationStep(name, description, icon, order, domainService);
}
// shortened for brevity
}
MemberKycVerificationStep
public class MemberKycVerificationStep : BaseEntity
{
public string Id { get; private set; }
public Guid KycVerificationStepId { get; private set; }
public KycVerificationStep KycVerificationStep { get; private set; }
public Guid MemberId { get; private set; }
public string Status { get; private set; }
public DateTimeOffset DateUpdated { get; private set; }
private MemberKycVerificationStep() { }
private MemberKycVerificationStep(
Guid kycVerificationStepId,
Guid memberId)
{
Id = $"{memberId}_{kycVerificationStepId}";
KycVerificationStepId = kycVerificationStepId;
MemberId = memberId;
Status = VerificationStatus.NotStarted.ToString();
AddDomainEvent(new MemberKycVerificationStepCreatedDomainEvent(MemberId, KycVerificationStepId));
}
public static MemberKycVerificationStep Create(
Guid kycVerificationStepId,
Guid memberId)
{
return new MemberKycVerificationStep(kycVerificationStepId, memberId);
}
}
Here’s how I try to query MemberKycVerificationStep
the get the KycVerificationStep
By MemberId
.
public async Task<Result<IPagedList<MemberKycVerificationStepDto>>> Handle(GetAllVerificationStepsByUserQuery request, CancellationToken cancellationToken)
{
KycVerificationStep included = null;
var results = await _querySession
.Query<MemberKycVerificationStep>()
.Include<KycVerificationStep>(x => included = x)
.On(x => x.KycVerificationStepId)
.Where(x => x.MemberId == request.UserId)
.Select(x => new MemberKycVerificationStepDto
{
KycVerificationStepId = x.KycVerificationStepId,
Name = included != null ? included.Name : "",
DateUpdated = x.DateUpdated,
Status = "x.Status",
MemberId = x.MemberId
})
.ToPagedListAsync(request.PageIndex, request.PageSize, cancellationToken);
return await Result<IPagedList<MemberKycVerificationStepDto>>.SuccessAsync(results);
}
But I get the following exception which comes from the linq expressions implementation from Marten.
System.ArgumentNullException: Value cannot be null. (Parameter ‘key’)
at System.Collections.Generic.Dictionary2.TryInsert(TKey key, TValue value, InsertionBehavior behavior) at System.Collections.Generic.Dictionary
2.set_Item(TKey key, TValue
value) at
Marten.Linq.Parsing.SelectParser.VisitConstant(ConstantExpression
node) at Marten.Linq.Parsing.SelectParser.Visit(Expression node)
at
System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression
node) at
Marten.Linq.Parsing.SelectParser.VisitBinary(BinaryExpression node)
at Marten.Linq.Parsing.SelectParser.Visit(Expression node) at
System.Linq.Expressions.ExpressionVisitor.VisitConditional(ConditionalExpression
node) at Marten.Linq.Parsing.SelectParser.Visit(Expression node)
at Marten.Linq.Parsing.SelectParser.ReadBinding(MemberAssignment
binding) at
Marten.Linq.Parsing.SelectParser.VisitMemberInit(MemberInitExpression
node) at Marten.Linq.Parsing.SelectParser.Visit(Expression node)
at Marten.Linq.Parsing.SelectParser..ctor(ISerializer serializer,
IQueryableMemberCollection members, Expression expression) at
Marten.Linq.Parsing.SelectorVisitor.ToSelectTransform(Expression
selectExpression, ISerializer serializer) at
Marten.Linq.Parsing.SelectorVisitor.VisitMemberInit(MemberInitExpression
node) at Marten.Linq.Parsing.SelectorVisitor.Visit(Expression node)
at Marten.Linq.CollectionUsage.BuildTopStatement(IMartenSession
session, IQueryableMemberCollection collection, IDocumentStorage
storage, QueryStatistics statistics) at
Marten.Linq.Parsing.LinqQueryParser.BuildStatements() at
Marten.Linq.Parsing.LinqQueryParser.BuildListHandlerT at
Marten.Linq.MartenLinqQueryable1.ToListAsync[TResult](CancellationToken token) at Marten.Pagination.PagedList
1.InitAsync(IQueryable1 queryable, Int32 pageNumber, Int32 pageSize, CancellationToken token) at Marten.Pagination.PagedList
1.CreateAsync(IQueryable1 queryable, Int32 pageNumber, Int32 pageSize, CancellationToken token) at Marten.Pagination.PagedListQueryableExtensions.ToPagedListAsync[T](IQueryable
1
queryable, Int32 pageNumber, Int32 pageSize, CancellationToken token)
The data for the MemberKycVerificationStep
document is present in the db. But I don’t understand why I’m getting a null reference. Please help.