Реализация imembersource в Marten для простого типаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Реализация imembersource в Marten для простого типа

Сообщение Anonymous »

У меня есть такой объект (упрощенный) < /p>

Код: Выделить всё

public class Root {
public ReferenceNumber Ref { get; set; }
}

public readonly record struct ReferenceNumber
{
private readonly string _referenceNumber;
public ReferenceNumber(in string referenceNumber)
{
_referenceNumber = referenceNumber.Trim();
}

public static implicit operator ReferenceNumber(in string value) =>
new(value);

public static implicit operator string(in ReferenceNumber reference) =>
reference._referenceNumber;

public override string ToString() => _referenceNumber;
}

< /code>
Когда я пытаюсь сделать запрос на корне, как это < /p>
await using IDocumentSession session = _readDocumentStore.LightweightSession();
return await session.Query()
.FirstOrDefaultAsync(x => x.ReferenceNumber == referenceNumber);
< /code>
Я получаю исключение, которое понятно < /p>

Мартен не может поддерживать пользовательские типы значений в выражении LINQ. Пожалуйста, запросите либо на простые свойства типа значения, либо зарегистрируйте пользовательский imembersource для этого типа значения. < /P>
< /blockquote>
Я искал пример реализации Imemberource < /code>, но даже Google дал мне только 3 результата.
Документация предлагает обсудить больше на канале Discord, и не предоставит информацию о IMEMBERAR. Помощь Copilot, вот реализация, которая дала мне < /p>
public class QueryableMember : IQueryableMember
{
public string JsonPathSegment { get; set; }
public string MemberName { get; set; }
public Type MemberType { get; set; }
public Type DeclaringType { get; set; }
public string Name { get; set; }
public bool IsAsync { get; set; }
public MemberInfo MemberInfo { get; set; }
public IQueryableMember Parent { get; set; }

public string TypedLocator => $"CAST({RawLocator} as text)";
public string RawLocator => $"d.data -> {SqlFragment()}";
public string JSONBLocator => $"d.data ->> {SqlFragment()}";
public IQueryableMember[] Ancestors => Parent == null ? [] : [..  Parent.Ancestors, Parent];
public string LocatorForIncludedDocumentId => $"d.data ->> {SqlFragment()}";
public string NullTestLocator => $"d.data -> {SqlFragment()} IS NULL";

private string SqlFragment()
{
return $"'{JsonPathSegment}'";
}

public void Apply(ICommandBuilder builder)
{
builder.Append(JSONBLocator);
}

public string BuildOrderingExpression(Ordering ordering, CasingRule casingRule)
{
string direction = ordering.Direction == OrderingDirection.Asc ? "asc" : "desc";
return $"{JSONBLocator} {direction}";
}

public Dictionary FindOrPlaceChildDictionaryForContainment(Dictionary dict)
{
if (!dict.TryGetValue(JsonPathSegment, out object? value))
{
value = new Dictionary();
dict[JsonPathSegment] = value;
}

return value as Dictionary;
}

public void PlaceValueInDictionaryForContainment(Dictionary dict, ConstantExpression constant)
{
// For ReferenceNumber, convert to string using ToString()
string value = constant.Value?.ToString() ?? string.Empty;
dict[JsonPathSegment] = value;
}

public string SelectorForDuplication(string pgType)
{
return $"{RawLocator} {pgType}";
}
}

public class ReferenceNumberMemberSource : IMemberSource
{
public bool TryResolve(
IQueryableMember parent,
StoreOptions options,
MemberInfo memberInfo,
Type memberType,
[NotNullWhen(true)] out IQueryableMember? member)
{
member = new QueryableMember
{
Parent = parent,
DeclaringType = memberInfo.DeclaringType!,
MemberType = memberType,
Name = memberInfo.Name,
MemberName = memberInfo.Name,
MemberInfo = memberInfo,
IsAsync = false,
JsonPathSegment = $"$.{memberInfo.Name}",
};

return true;
}
}
I have no idea if this is good or not, but when I register the IMemberSource, start the Application, I got an exception

Id of type System.Guid cannot be used as a Duplicated Field by Marten (Parameter 'members')

I do not understand why this Исключение происходит, но в целом мой случай простой:

Код: Выделить всё

ReferenceNumber
инкапсулирует строку, и я хочу рассматривать ее как строку при запросе. Вот и все, что больше..

Подробнее здесь: https://stackoverflow.com/questions/796 ... imple-type
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»