?我有这个电话:publicIObservableSubscribe(objecttopic,stringservice,stringconnectionString,stringquery){try{this.connection.ConnectionString=connectionString;这个.connection.Open();this.connection.Query(query,new{transactionid=topic}).ToObservable().Subscribe(message=>this.subject.OnNext(message));返回这个主题;}catch(Exceptione){this.subject.OnError(e);返回这个主题;}最后{this.subject.OnCompleted();这个.connection.Close();这是我的查询:使用IDS作为(从MYDB选择L1_ID、L2_ID、L1_VALUE、L2_VALUE,其中MYDB.ID=:transactionid)选择*从(选择L1_ID作为ID,round(L1_VALUE,28)作为VALUE从IDS联合选择L2_IDasID,round(L2_VALUE,28)asVALUEfromIDS)UN抛出此错误:System.Tuple2[[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Nullable需要无参默认构造函数或匹配的签名(System.StringID,System.DecimalVALUE)2[[System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089],[System.Nullable1[[System.Decimal,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]],mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089]]这里的问题不是Nullable,而是TupleDapper使用了两个其中之一模式。假设我们的数据具有列IDvarcharVALUEdecimal(因为在您的场景中似乎是这种情况)要将其加载到T中,它想要执行任一操作(在确定0是ID且1是VALUE之后):Trow=newT(){ID=reader.GetInt32(0),VALUE=reader.GetDecimal(1)};或Trow=newT(ID:reader.GetInt32(0),VALUE:reader.GetDecimal(1));请注意,我在这里进行了很多简化,并且它对区分大小写非常宽容,但这基本上就是它想要的。现在,问题来了:元组没有这些。它有构造函数:publicTuple(T1item1,T2item2);这在这里行不通-dapper不确定发生了什么,所以它不会尝试。这听起来很刺耳,但dapper尽量不介意列顺序,并且在一般情况下(列不是所有不同的类型),当没有匹配项时,不清楚正确的方法应该是什么。选项:创建表单的自定义类型:publicclassSomeType{//也可以是结构,不可变的,无论publicintId{get;set;}publicdecimalValue{get;set;}}并使用T===SomeType使用非通用API并重新映射:Query(query,new{transactionid=topic}).Select(row=>Tuple.Create((int)row.ID,(decimal)row.VALUE).Whatever(...);将结果列命名为item1和item2(没错!)以上就是C#学习教程:HowtousegenericsandNullabletypesinDapper?所有内容分享出来,如果对大家有用需要进一步了解C#学习教程,希望大家多多关注——本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如需转载,请注明来源:
