Cassandra:参数类型不匹配
Cassandra: Argument types do not match
我是 Cassandra 的新手,使用 linq 为我的 Cassandra 数据库创建了一个通用存储库。对于我的 Single() 方法,我将 where 条件作为参数传递。
这是我的单一方法:
Single(Expression<Func<T, bool>> exp)
这是我用来查询 cassandra 数据库的 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" 的 "Argument types do not match",我很困惑这可能是从哪里来的。
数据库table列:
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#之间的映射规则,一切似乎都是正确的。
通过一些实验,我找到了答案。来找出基于 Cassandra 列表的集合不映射到 c# 列表,而是映射到 c# IEnumerable 对象。
我是 Cassandra 的新手,使用 linq 为我的 Cassandra 数据库创建了一个通用存储库。对于我的 Single() 方法,我将 where 条件作为参数传递。
这是我的单一方法:
Single(Expression<Func<T, bool>> exp)
这是我用来查询 cassandra 数据库的 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" 的 "Argument types do not match",我很困惑这可能是从哪里来的。
数据库table列:
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#之间的映射规则,一切似乎都是正确的。
通过一些实验,我找到了答案。来找出基于 Cassandra 列表的集合不映射到 c# 列表,而是映射到 c# IEnumerable 对象。