7.x.1.10 修复匿名对象返回nullable的value的bug
This commit is contained in:
parent
b058b66a3a
commit
6d2253680b
|
@ -61,6 +61,7 @@ namespace Sample.AutoCreateIfPresent
|
||||||
|
|
||||||
public override string ShardingKeyToTail(object shardingKey)
|
public override string ShardingKeyToTail(object shardingKey)
|
||||||
{
|
{
|
||||||
|
InitOnce();
|
||||||
return $"{shardingKey}";
|
return $"{shardingKey}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +71,12 @@ namespace Sample.AutoCreateIfPresent
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public override List<string> GetTails()
|
public override List<string> GetTails()
|
||||||
|
{
|
||||||
|
InitOnce();
|
||||||
|
return _tails.Keys.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitOnce()
|
||||||
{
|
{
|
||||||
if (!_inited)
|
if (!_inited)
|
||||||
{
|
{
|
||||||
|
@ -82,8 +89,7 @@ namespace Sample.AutoCreateIfPresent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return _tails.Keys.ToList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Configure(EntityMetadataTableBuilder<AreaDevice> builder)
|
public override void Configure(EntityMetadataTableBuilder<AreaDevice> builder)
|
||||||
|
|
|
@ -85,7 +85,9 @@ namespace Sample.MySql.Controllers
|
||||||
var shardingTableCreator = _shardingRuntimeContext.GetShardingTableCreator();
|
var shardingTableCreator = _shardingRuntimeContext.GetShardingTableCreator();
|
||||||
var tableRouteManager = _shardingRuntimeContext.GetTableRouteManager();
|
var tableRouteManager = _shardingRuntimeContext.GetTableRouteManager();
|
||||||
//系统的时间分片都会实现 ITailAppendable 如果不是系统的自定义的转成你自己的对象即可
|
//系统的时间分片都会实现 ITailAppendable 如果不是系统的自定义的转成你自己的对象即可
|
||||||
var virtualTableRoute = (ITailAppendable)tableRouteManager.GetRoute(typeof(SysUserMod));
|
var tableRoute = tableRouteManager.GetRoute(typeof(SysUserMod));
|
||||||
|
var tails = tableRoute.GetTails();
|
||||||
|
var virtualTableRoute = (ITailAppendable)tableRoute;
|
||||||
//一定要先在路由里面添加尾巴
|
//一定要先在路由里面添加尾巴
|
||||||
virtualTableRoute.Append("20220921");
|
virtualTableRoute.Append("20220921");
|
||||||
shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
|
shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
|
||||||
|
@ -330,6 +332,13 @@ namespace Sample.MySql.Controllers
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public async Task<IActionResult> Get10()
|
public async Task<IActionResult> Get10()
|
||||||
{
|
{
|
||||||
|
var shardingDbContextExecutor = _defaultTableDbContext.GetShardingExecutor();
|
||||||
|
var dataSourceDbContexts = shardingDbContextExecutor.GetCurrentDbContexts();
|
||||||
|
var sourceDbContexts = dataSourceDbContexts.Values;
|
||||||
|
var dataSourceDbContext = sourceDbContexts.FirstOrDefault();
|
||||||
|
var dbConnection = dataSourceDbContext.GetCurrentContexts().FirstOrDefault().Value.Database.GetDbConnection();
|
||||||
|
|
||||||
|
|
||||||
var sysUserMod1 = await _defaultTableDbContext.Set<SysTest>().Where(o=>o.UserId=="11231").AllAsync(o=>o.Id=="1123"&&string.Compare(o.UserId,"123")>0);
|
var sysUserMod1 = await _defaultTableDbContext.Set<SysTest>().Where(o=>o.UserId=="11231").AllAsync(o=>o.Id=="1123"&&string.Compare(o.UserId,"123")>0);
|
||||||
var sysUserMod2 = await _defaultTableDbContext.Set<SysTest>().AllAsync(o=>o.Id=="1123");
|
var sysUserMod2 = await _defaultTableDbContext.Set<SysTest>().AllAsync(o=>o.Id=="1123");
|
||||||
var dateTime = new DateTime(2020,1,1);
|
var dateTime = new DateTime(2020,1,1);
|
||||||
|
@ -354,5 +363,25 @@ namespace Sample.MySql.Controllers
|
||||||
|
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IActionResult> Get12()
|
||||||
|
{
|
||||||
|
var sysTests = from ut in _defaultTableDbContext.Set<SysTest>()
|
||||||
|
where _defaultTableDbContext.Set<SysUserLogByMonth>().Any(x => x.Id == ut.Id)
|
||||||
|
select ut;
|
||||||
|
var tests = sysTests.ToList();
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IActionResult> Get13()
|
||||||
|
{
|
||||||
|
var list =await _defaultTableDbContext.Set<SysUserLogByMonth>()
|
||||||
|
.GroupBy(o=>o.Time)
|
||||||
|
.Select(o=>new
|
||||||
|
{
|
||||||
|
o.Key
|
||||||
|
}).ToListAsync();
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,6 @@ namespace Sample.MySql.Domain.Entities
|
||||||
public class SysUserLogByMonth
|
public class SysUserLogByMonth
|
||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public DateTime Time { get; set; }
|
public DateTime? Time { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
using Sample.MySql.Domain.Entities;
|
using Sample.MySql.Domain.Entities;
|
||||||
|
|
||||||
namespace Sample.MySql.Domain.Maps
|
namespace Sample.MySql.Domain.Maps
|
||||||
|
@ -12,7 +13,7 @@ namespace Sample.MySql.Domain.Maps
|
||||||
builder.Property(o => o.Id).IsRequired().HasMaxLength(128);
|
builder.Property(o => o.Id).IsRequired().HasMaxLength(128);
|
||||||
builder.Property(o => o.UserId).IsRequired().HasMaxLength(128);
|
builder.Property(o => o.UserId).IsRequired().HasMaxLength(128);
|
||||||
builder.Property(o => o.UserId).IsConcurrencyToken();
|
builder.Property(o => o.UserId).IsConcurrencyToken();
|
||||||
builder.ToTable(nameof(SysTest));
|
builder.ToTable(nameof(SysTest),"dbdbd0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -74,6 +74,8 @@ namespace Sample.MySql
|
||||||
services.AddShardingDbContext<DefaultShardingDbContext>()
|
services.AddShardingDbContext<DefaultShardingDbContext>()
|
||||||
.UseRouteConfig((sp, o) =>
|
.UseRouteConfig((sp, o) =>
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// AppDomain.CurrentDomain.GetAssemblies().
|
||||||
o.AddShardingTableRoute<DynamicTableRoute>();
|
o.AddShardingTableRoute<DynamicTableRoute>();
|
||||||
o.AddShardingTableRoute<SysUserLogByMonthRoute>();
|
o.AddShardingTableRoute<SysUserLogByMonthRoute>();
|
||||||
o.AddShardingTableRoute<SysUserModVirtualTableRoute>();
|
o.AddShardingTableRoute<SysUserModVirtualTableRoute>();
|
||||||
|
@ -93,6 +95,7 @@ namespace Sample.MySql
|
||||||
// {
|
// {
|
||||||
// b.UseMemoryCache(memoryCache);
|
// b.UseMemoryCache(memoryCache);
|
||||||
// });
|
// });
|
||||||
|
o.CheckShardingKeyValueGenerated = false;
|
||||||
o.IgnoreCreateTableError = false;
|
o.IgnoreCreateTableError = false;
|
||||||
o.UseEntityFrameworkCoreProxies = true;
|
o.UseEntityFrameworkCoreProxies = true;
|
||||||
o.CacheModelLockConcurrencyLevel = 1024;
|
o.CacheModelLockConcurrencyLevel = 1024;
|
||||||
|
@ -107,6 +110,8 @@ namespace Sample.MySql
|
||||||
|
|
||||||
o.UseShardingQuery((conStr, builder) =>
|
o.UseShardingQuery((conStr, builder) =>
|
||||||
{
|
{
|
||||||
|
var logger = sp.ApplicationServiceProvider.GetService<ILogger<Startup>>();
|
||||||
|
logger.LogInformation(conStr);
|
||||||
builder.UseMySql(conStr, new MySqlServerVersion(new Version()))
|
builder.UseMySql(conStr, new MySqlServerVersion(new Version()))
|
||||||
.UseLoggerFactory(loggerFactory1)
|
.UseLoggerFactory(loggerFactory1)
|
||||||
.EnableSensitiveDataLogging();
|
.EnableSensitiveDataLogging();
|
||||||
|
@ -180,7 +185,7 @@ namespace Sample.MySql
|
||||||
{
|
{
|
||||||
app.UseDeveloperExceptionPage();
|
app.UseDeveloperExceptionPage();
|
||||||
}
|
}
|
||||||
// app.ApplicationServices.UseAutoTryCompensateTable();
|
app.ApplicationServices.UseAutoTryCompensateTable();
|
||||||
|
|
||||||
// var shardingRuntimeContext = app.ApplicationServices.GetRequiredService<IShardingRuntimeContext>();
|
// var shardingRuntimeContext = app.ApplicationServices.GetRequiredService<IShardingRuntimeContext>();
|
||||||
// var entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager();
|
// var entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
@ -20,6 +21,24 @@ namespace ShardingCore.Sharding.Enumerators.AggregateExtensions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static class AggregateExtension
|
internal static class AggregateExtension
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public static object ChangeType(this object value, Type targetType)
|
||||||
|
{
|
||||||
|
//targetType类型是否为泛型,因为nullable是泛型类,
|
||||||
|
if (targetType.IsGenericType &&
|
||||||
|
//判断targetType是否为nullable泛型类
|
||||||
|
targetType.IsNullableType())
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
NullableConverter nullableConverter = new NullableConverter(targetType);
|
||||||
|
targetType = nullableConverter.UnderlyingType;
|
||||||
|
}
|
||||||
|
return Convert.ChangeType(value, targetType);
|
||||||
|
}
|
||||||
public static TSource CopyTSource<TSource>(TSource source)
|
public static TSource CopyTSource<TSource>(TSource source)
|
||||||
{
|
{
|
||||||
var anonType = source.GetType();
|
var anonType = source.GetType();
|
||||||
|
@ -27,9 +46,20 @@ namespace ShardingCore.Sharding.Enumerators.AggregateExtensions
|
||||||
var allPropertyTypes= allProperties.Select(o=>o.PropertyType).ToArray();
|
var allPropertyTypes= allProperties.Select(o=>o.PropertyType).ToArray();
|
||||||
if (anonType.IsAnonymousType())
|
if (anonType.IsAnonymousType())
|
||||||
{
|
{
|
||||||
var constantExpressions = allProperties.Select(o => Expression.Constant(o.GetValue(source))).ToArray();
|
var constantExpressions = allProperties.Select(o =>
|
||||||
|
{
|
||||||
|
var value = o.GetValue(source);
|
||||||
|
if (value != null &&o.PropertyType.IsNullableType())
|
||||||
|
{
|
||||||
|
// var changeTypeValue = ChangeType(value,o.PropertyType);
|
||||||
|
return Expression.Constant(value,o.PropertyType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Expression.Constant(value);
|
||||||
|
}).ToArray();
|
||||||
|
var constructorInfo = anonType.GetConstructor(allPropertyTypes);
|
||||||
var exp = Expression.New(
|
var exp = Expression.New(
|
||||||
anonType.GetConstructor(allPropertyTypes),
|
constructorInfo,
|
||||||
constantExpressions);
|
constantExpressions);
|
||||||
var lambda = LambdaExpression.Lambda(exp);
|
var lambda = LambdaExpression.Lambda(exp);
|
||||||
TSource myObj = (TSource)lambda.Compile().DynamicInvoke();
|
TSource myObj = (TSource)lambda.Compile().DynamicInvoke();
|
||||||
|
|
Loading…
Reference in New Issue