修复linq解析方法获取值,并且发布版x.3.1.12
This commit is contained in:
parent
96c2833a49
commit
145ca77c78
|
@ -1,8 +1,8 @@
|
||||||
:start
|
:start
|
||||||
::定义版本
|
::定义版本
|
||||||
set EFCORE2=2.3.1.11
|
set EFCORE2=2.3.1.12
|
||||||
set EFCORE3=3.3.1.11
|
set EFCORE3=3.3.1.12
|
||||||
set EFCORE5=5.3.1.11
|
set EFCORE5=5.3.1.12
|
||||||
|
|
||||||
::删除所有bin与obj下的文件
|
::删除所有bin与obj下的文件
|
||||||
@echo off
|
@echo off
|
||||||
|
|
|
@ -2,6 +2,7 @@ using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using System.Reflection;
|
||||||
using ShardingCore.Core.VirtualDatabase;
|
using ShardingCore.Core.VirtualDatabase;
|
||||||
using ShardingCore.Core.VirtualRoutes;
|
using ShardingCore.Core.VirtualRoutes;
|
||||||
using ShardingCore.Core.VirtualTables;
|
using ShardingCore.Core.VirtualTables;
|
||||||
|
@ -64,10 +65,16 @@ namespace ShardingCore.Core.Internal.Visitors
|
||||||
private bool IsConstantOrMember(Expression expression)
|
private bool IsConstantOrMember(Expression expression)
|
||||||
{
|
{
|
||||||
return expression is ConstantExpression
|
return expression is ConstantExpression
|
||||||
|| (expression is MemberExpression member && (member.Expression is ConstantExpression || member.Expression is MemberExpression || member.Expression is MemberExpression));
|
|| (expression is MemberExpression member && (member.Expression is ConstantExpression || member.Expression is MemberExpression || member.Expression is MemberExpression))
|
||||||
|
|| expression is MethodCallExpression;
|
||||||
}
|
}
|
||||||
|
|
||||||
private object GetFieldValue(Expression expression)
|
private bool IsMethodCall(Expression expression)
|
||||||
|
{
|
||||||
|
return expression is MethodCallExpression;
|
||||||
|
}
|
||||||
|
|
||||||
|
private object GetShardingKeyValue(Expression expression)
|
||||||
{
|
{
|
||||||
if (expression is ConstantExpression)
|
if (expression is ConstantExpression)
|
||||||
return (expression as ConstantExpression).Value;
|
return (expression as ConstantExpression).Value;
|
||||||
|
@ -81,9 +88,27 @@ namespace ShardingCore.Core.Internal.Visitors
|
||||||
|
|
||||||
if (expression is MemberExpression member1Expression)
|
if (expression is MemberExpression member1Expression)
|
||||||
{
|
{
|
||||||
|
var target = GetShardingKeyValue(member1Expression.Expression);
|
||||||
|
if (member1Expression.Member is FieldInfo field)
|
||||||
|
return field.GetValue(target);
|
||||||
|
if (member1Expression.Member is PropertyInfo property)
|
||||||
|
return property.GetValue(target);
|
||||||
return Expression.Lambda(member1Expression).Compile().DynamicInvoke();
|
return Expression.Lambda(member1Expression).Compile().DynamicInvoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (expression is MethodCallExpression methodCallExpression)
|
||||||
|
{
|
||||||
|
return Expression.Lambda(methodCallExpression).Compile().DynamicInvoke();
|
||||||
|
//return methodCallExpression.Method.Invoke(
|
||||||
|
// GetShardingKeyValue(methodCallExpression.Object),
|
||||||
|
// methodCallExpression.Arguments
|
||||||
|
// .Select(
|
||||||
|
// a => GetShardingKeyValue(a)
|
||||||
|
// )
|
||||||
|
// .ToArray()
|
||||||
|
//);
|
||||||
|
}
|
||||||
|
|
||||||
throw new ShardingKeyGetValueException("cant get value " + expression);
|
throw new ShardingKeyGetValueException("cant get value " + expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,18 +238,18 @@ namespace ShardingCore.Core.Internal.Visitors
|
||||||
//单个
|
//单个
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool paramterAtLeft;
|
bool paramterAtLeft=false;
|
||||||
object value = null;
|
object value = null;
|
||||||
|
|
||||||
if (IsShardingKey(binaryExpression.Left)&&IsConstantOrMember(binaryExpression.Right))
|
if (IsShardingKey(binaryExpression.Left)&&IsConstantOrMember(binaryExpression.Right))
|
||||||
{
|
{
|
||||||
paramterAtLeft = true;
|
paramterAtLeft = true;
|
||||||
value = GetFieldValue(binaryExpression.Right);
|
value = GetShardingKeyValue(binaryExpression.Right);
|
||||||
}
|
}
|
||||||
else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right))
|
else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right))
|
||||||
{
|
{
|
||||||
paramterAtLeft = false;
|
paramterAtLeft = false;
|
||||||
value = GetFieldValue(binaryExpression.Left);
|
value = GetShardingKeyValue(binaryExpression.Left);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return x => true;
|
return x => true;
|
||||||
|
|
|
@ -172,7 +172,7 @@ namespace ShardingCore.Test50
|
||||||
public async Task ToList_Id_In_Test()
|
public async Task ToList_Id_In_Test()
|
||||||
{
|
{
|
||||||
var ids = new[] {"1", "2", "3", "4"};
|
var ids = new[] {"1", "2", "3", "4"};
|
||||||
var sysUserMods = await _virtualDbContext.Set<SysUserMod>().Where(o => ids.Contains(o.Id)).ToListAsync();
|
var sysUserMods = await _virtualDbContext.Set<SysUserMod>().Where(o => new List<string> { "1", "2", "3", "4" }.Contains(o.Id)).ToListAsync();
|
||||||
foreach (var id in ids)
|
foreach (var id in ids)
|
||||||
{
|
{
|
||||||
Assert.Contains(sysUserMods, o => o.Id == id);
|
Assert.Contains(sysUserMods, o => o.Id == id);
|
||||||
|
@ -184,8 +184,11 @@ namespace ShardingCore.Test50
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task ToList_Id_Eq_Test()
|
public async Task ToList_Id_Eq_Test()
|
||||||
{
|
{
|
||||||
var mods = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Id == "3").ToListAsync();
|
var id= 3;
|
||||||
|
var mods = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Id == id.ToString()).ToListAsync();
|
||||||
Assert.Single(mods);
|
Assert.Single(mods);
|
||||||
|
var mods1 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Id == "4").ToListAsync();
|
||||||
|
Assert.Single(mods1);
|
||||||
Assert.Equal("3", mods[0].Id);
|
Assert.Equal("3", mods[0].Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue