修复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
::定义版本
set EFCORE2=2.3.1.11
set EFCORE3=3.3.1.11
set EFCORE5=5.3.1.11
set EFCORE2=2.3.1.12
set EFCORE3=3.3.1.12
set EFCORE5=5.3.1.12
::删除所有bin与obj下的文件
@echo off

View File

@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using ShardingCore.Core.VirtualDatabase;
using ShardingCore.Core.VirtualRoutes;
using ShardingCore.Core.VirtualTables;
@ -64,10 +65,16 @@ namespace ShardingCore.Core.Internal.Visitors
private bool IsConstantOrMember(Expression expression)
{
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)
return (expression as ConstantExpression).Value;
@ -81,9 +88,27 @@ namespace ShardingCore.Core.Internal.Visitors
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();
}
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);
}
@ -213,18 +238,18 @@ namespace ShardingCore.Core.Internal.Visitors
//单个
else
{
bool paramterAtLeft;
bool paramterAtLeft=false;
object value = null;
if (IsShardingKey(binaryExpression.Left) && IsConstantOrMember(binaryExpression.Right))
if (IsShardingKey(binaryExpression.Left)&&IsConstantOrMember(binaryExpression.Right))
{
paramterAtLeft = true;
value = GetFieldValue(binaryExpression.Right);
value = GetShardingKeyValue(binaryExpression.Right);
}
else if (IsConstantOrMember(binaryExpression.Left) && IsShardingKey(binaryExpression.Right))
{
paramterAtLeft = false;
value = GetFieldValue(binaryExpression.Left);
value = GetShardingKeyValue(binaryExpression.Left);
}
else
return x => true;

View File

@ -172,7 +172,7 @@ namespace ShardingCore.Test50
public async Task ToList_Id_In_Test()
{
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)
{
Assert.Contains(sysUserMods, o => o.Id == id);
@ -184,8 +184,11 @@ namespace ShardingCore.Test50
[Fact]
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);
var mods1 = await _virtualDbContext.Set<SysUserMod>().Where(o => o.Id == "4").ToListAsync();
Assert.Single(mods1);
Assert.Equal("3", mods[0].Id);
}