修复linq解析方法获取值,并且发布版x.3.1.12

This commit is contained in:
xuejiaming 2021-10-26 23:12:18 +08:00
parent 96c2833a49
commit 145ca77c78
3 changed files with 39 additions and 11 deletions

View File

@ -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

View File

@ -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;

View File

@ -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);
} }