Кассандра: типы аргументов не совпадают

Я новичок в Cassandra и с помощью linq создал общий репозиторий для своей базы данных Cassandra. Для моего метода Single() я передаю критерии where в качестве параметра.

Это мой метод Single:

Single(Expression<Func<T, bool>> exp)

Это код linq, который я использую для запроса базы данных Кассандры

public async Task<T> Single(Expression<Func<T, bool>> exp)
{
    return await GetTable.Where<T>(exp).FirstOrDefault().ExecuteAsync();
}

Это метод, вызывающий единственный метод

public override Task OnConnected()
{
    if (Context.User != null)
    {
        string userName = Context.User.Identity.Name;

        this.Groups.Add(userName, Context.ConnectionId);

        ***** this is the line with the issue ******
        Notification notification = Task.Run(() => _notificationRepository.Single(x => x.UserName.Equals(userName))).Result;

        if (notification == null)
        {
            _notificationRepository.CreateInstance(new NotificationUserMapping { Connections = new string[] { Context.ConnectionId }, UserName = Context.User.Identity.Name });
        }
        else if (!notification.Connections.Contains(Context.ConnectionId))
        {
            notification.Connections.Add(Context.ConnectionId);
            _notificationRepository.Save(notification);
        }
    }

    return base.OnConnected();
}

Я продолжаю получать "System.AggregateException" типа "Аргументы не совпадают", и я не понимаю, откуда это может исходить.

Столбцы таблицы базы данных:

id uuid PRIMARY KEY,
connections list<text>,
username text

и C# POCO:

[Table(ExplicitColumns = true)]
public class ConnectionMapping
{
    [Column("id")]
    public Guid Id { get; set; }
    [Column("connections")]
    public IList<string> Connections { get; set; }
    [Column("username")]
    public string UserName { get; set; }
}

и исключение:

   at System.Linq.Expressions.Expression.Condition(Expression test, Expression ifTrue, Expression ifFalse)
   at Cassandra.Mapping.MapperFactory.GetExpressionToGetColumnValueFromRow(ParameterExpression row, CqlColumn dbColumn, Type pocoDestType)
   at Cassandra.Mapping.MapperFactory.CreateMapperForPoco[T](RowSet rows, PocoData pocoData)
   at Cassandra.Mapping.MapperFactory.CreateMapper[T](RowSet rows)
   at Cassandra.Mapping.MapperFactory.<>c__DisplayClass1`1.<GetMapper>b__0(Tuple`2 _)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Cassandra.Mapping.MapperFactory.GetMapper[T](String cql, RowSet rows)
   at Cassandra.Mapping.Mapper.<>c__DisplayClass7`1.<FetchAsync>b__6(Statement s, RowSet rs)
   at Cassandra.Mapping.Mapper.<>c__DisplayClass2`1.<>c__DisplayClass4.<ExecuteAsyncAndAdapt>b__1(Task`1 t2)
   at Cassandra.Tasks.TaskHelper.DoNext[TIn,TOut](Task`1 task, Func`2 next)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at CompanyNamespace.CompanyDomain.NotificationRepository.<SingleByUserName>d__0.MoveNext()

Чего мне не хватает Я показал документы. и правила отображения между Cassandra и C#, и все кажется правильным.

1 ответ

Решение

Через некоторые эксперименты я нашел ответ. Приходите, чтобы узнать, что коллекции на основе списков Cassandra не отображаются в списки C#, а вместо этого отображаются в C# IEnumerable объекты.

Другие вопросы по тегам