在 OrmLite / Servicestack / Linqpad 中使用连接时值不能为空
Value cannot be null when using join in OrmLite / Servicestack / Linqpad
连接两个表时我得到
ArgumentNullException: Value cannot be null. Parameter name: key.
执行查询后会出现这种情况,更改 Linqpad 中的任意行并再次执行。
using (var db = _factory.OpenDbConnection())
{
var q = db.From<Customer>()
.Join<Customer, Address>();
var results = db.SelectMulti<Customer, Address>(q);
results.Dump();
}
客户
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
地址
public class Address
{
public int Id { get; set; }
public int CustomerId { get; set; }
}
ServiceStack 抛出这个错误
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at ServiceStack.TypeExtensions.GetActivator(ConstructorInfo ctor)
at ServiceStack.OrmLite.OrmLiteUtils.ConvertToList[T](IDataReader reader, IOrmLiteDialectProvider dialectProvider, HashSet`1 onlyFields)
at ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ExprConvertToList[T](IDbCommand dbCmd, String sql, IEnumerable`1 sqlParams, HashSet`1 onlyFields)
at ServiceStack.OrmLite.ReadExpressionCommandExtensions.SelectMulti[T,T2](IDbCommand dbCmd, SqlExpression`1 q)
at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter)
at UserQuery.Main() in C:\Users\kairu\AppData\Local\Temp\LINQPad5\_uimlqbjb\plnhhb\LINQPadQuery.cs:line 54
at LINQPad.ExecutionModel.ClrQueryRunner.Run()
at LINQPad.ExecutionModel.Server.RunQuery(QueryRunner runner)
at LINQPad.ExecutionModel.Server.StartQuery(QueryRunner runner)
at LINQPad.ExecutionModel.Server.<>c__DisplayClass153_0.<ExecuteClrQuery>b__0()
at LINQPad.ExecutionModel.Server.SingleThreadExecuter.Work()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
使用 ServiceStack 版本 5.1.0 net45
这个example works as expected on Gistlyn:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Address
{
public int Id { get; set; }
public int CustomerId { get; set; }
}
db.CreateTable<Customer>();
db.CreateTable<Address>();
db.Insert(new Customer { Id = 1, Name = "C" });
db.Insert(new Address { Id = 1, CustomerId = 1 });
var q = db.From<Customer>()
.Join<Customer,Address>();
var results = db.SelectMulti<Customer, Address>(q);
results.PrintDump();
这可能是 LINQ Pad 的问题。
连接两个表时我得到
ArgumentNullException: Value cannot be null. Parameter name: key.
执行查询后会出现这种情况,更改 Linqpad 中的任意行并再次执行。
using (var db = _factory.OpenDbConnection())
{
var q = db.From<Customer>()
.Join<Customer, Address>();
var results = db.SelectMulti<Customer, Address>(q);
results.Dump();
}
客户
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
地址
public class Address
{
public int Id { get; set; }
public int CustomerId { get; set; }
}
ServiceStack 抛出这个错误
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
at ServiceStack.TypeExtensions.GetActivator(ConstructorInfo ctor)
at ServiceStack.OrmLite.OrmLiteUtils.ConvertToList[T](IDataReader reader, IOrmLiteDialectProvider dialectProvider, HashSet`1 onlyFields)
at ServiceStack.OrmLite.OrmLiteResultsFilterExtensions.ExprConvertToList[T](IDbCommand dbCmd, String sql, IEnumerable`1 sqlParams, HashSet`1 onlyFields)
at ServiceStack.OrmLite.ReadExpressionCommandExtensions.SelectMulti[T,T2](IDbCommand dbCmd, SqlExpression`1 q)
at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter)
at UserQuery.Main() in C:\Users\kairu\AppData\Local\Temp\LINQPad5\_uimlqbjb\plnhhb\LINQPadQuery.cs:line 54
at LINQPad.ExecutionModel.ClrQueryRunner.Run()
at LINQPad.ExecutionModel.Server.RunQuery(QueryRunner runner)
at LINQPad.ExecutionModel.Server.StartQuery(QueryRunner runner)
at LINQPad.ExecutionModel.Server.<>c__DisplayClass153_0.<ExecuteClrQuery>b__0()
at LINQPad.ExecutionModel.Server.SingleThreadExecuter.Work()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
使用 ServiceStack 版本 5.1.0 net45
这个example works as expected on Gistlyn:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Address
{
public int Id { get; set; }
public int CustomerId { get; set; }
}
db.CreateTable<Customer>();
db.CreateTable<Address>();
db.Insert(new Customer { Id = 1, Name = "C" });
db.Insert(new Address { Id = 1, CustomerId = 1 });
var q = db.From<Customer>()
.Join<Customer,Address>();
var results = db.SelectMulti<Customer, Address>(q);
results.PrintDump();
这可能是 LINQ Pad 的问题。