C# //创造。相反,使用的表达式会导致false。 //因此,如果“yourTstList”不包含用户id,则用户 //不会被查询。 comparisonValuesBehaviourFlags:comparisonValuesBehaviourFlags.NullOrEmptyLeadsToFalse) //一个项目的每个表达式都与OrElse(| |)组合。 //因此,一个用户的ID可以是一个或另一个“onestitem”。 .DefinePredicatePerItem(Expression.OrElse, sourceAndItemPredicate:(用户,OneStatItem)=>user.Id==OneStatItem) .BuildLambdaExpression(); dbContext.Users.AsQueryable().Where(whereExpression)。
您可以在my on中找到CollectionConstantPredicateBuilder。但异常消息中的C# //创造。相反,使用的表达式会导致false。 //因此,如果“yourTstList”不包含用户id,则用户 //不会被查询。 comparisonValuesBehaviourFlags:comparisonValuesBehaviourFlags.NullOrEmptyLeadsToFalse) //一个项目的每个表达式都与OrElse(| |)组合。 //因此,一个用户的ID可以是一个或另一个“onestitem”。 .DefinePredicatePerItem(Expression.OrElse, sourceAndItemPredicate:(用户,OneStatItem)=>user.Id==OneStatItem) .BuildLambdaExpression(); dbContext.Users.AsQueryable().Where(whereExpression)。,c#,linq,.net-core,entity-framework-core,expression-trees,C#,Linq,.net Core,Entity Framework Core,Expression Trees,您可以在my on中找到CollectionConstantPredicateBuilder。但异常消息中的u=>仍然表明参数无效。这就是你需要战斗的地方。我没办法,因为我没有序列化/反序列化代码。如果您提供完整的复制,我可以看一看。您的示例用法中的结果是什么以及如何获得它?不管怎样,我自己解决了。问题是由LambdaExpressionNode和ParameterExpressionNode方法的FromNode实现引起的。处理lambda表达式节点的主体时,您正在创建新的ParameterE
u=>
仍然表明参数无效。这就是你需要战斗的地方。我没办法,因为我没有序列化/反序列化代码。如果您提供完整的复制,我可以看一看。您的示例用法中的结果是什么以及如何获得它?不管怎样,我自己解决了。问题是由LambdaExpressionNode
和ParameterExpressionNode
方法的FromNode
实现引起的。处理lambda表达式节点的主体时,您正在创建新的ParameterExpression
对象,这些对象与创建的对象不同,存储在parameterExpressions
中,用于创建LambdaExpression
。您需要某种方法将主体中使用的参数节点映射到为lambda创建的参数表达式。类似于反序列化程序处理共享引用的方式。不确定如何使用FromNode
签名来实现这一点,可能需要一些额外的参数,或者您可以将其用作服务定位器来获取某种“参数解析上下文”-基本上是映射(字典)从ParameterExpressionNode
到ParameterExpression
。很高兴您解决了这个问题。祝你下一个好运:-)öБ,谢谢!我想,在我返回DatabaseService实现后不久,我将使用它作为数据库上下文中使用的所有服务的一点!如果您遇到任何问题,如果您能提供反馈,那就太好了,这样我就可以改进我的实施。您可以在GitHub上或在此处执行此操作。:)
var dataQuery = testDb.Users.Include(e => e.EmployeeInfo).Include(f => f.Notifications).Where(s => tstList.Contains(s.Id)).Select(e => e.FullName);
var tstEspressionBase = dataQuery.Expression;
var tstEspression = new ReflectionLocalValculationVisitor().Visit(tstEspressionBase);
public class ReflectionLocalValculationVisitor : ExpressionVisitor
{
protected override Expression VisitMember(MemberExpression memberExpression)
{
var expression = Visit(memberExpression.Expression);
if (expression is ConstantExpression)
{
object container = ((ConstantExpression)expression).Value;
var member = memberExpression.Member;
if (member is FieldInfo)
{
object value = ((FieldInfo)member).GetValue(container);
return Expression.Constant(value);
}
if (member is PropertyInfo)
{
object value = ((PropertyInfo)member).GetValue(container, null);
return Expression.Constant(value);
}
}
return base.VisitMember(memberExpression);
}
}
var tstList = new List<Guid>()
{
new Guid("D45E1A1A-F546-48DB-77BA-08D7775C6A93"),
new Guid("5B21C782-9B95-48F2-77BD-08D7775C6A93")
};
var providerAsync = testDb.GetService<IAsyncQueryProvider>();
var toListAsyncMethodInfo = typeof(EntityFrameworkQueryableExtensions).GetMethod(nameof(EntityFrameworkQueryableExtensions.ToListAsync)).MakeGenericMethod(typeof(string));
var s3 = await toListAsyncMethodInfo.InvokeAsync(null, new object[] { providerAsync.CreateQuery(tstEspression), default(CancellationToken) }).ConfigureAwait(false);
var asEnumerableMethod = typeof(Enumerable).GetMethod(nameof(Enumerable.AsEnumerable)).MakeGenericMethod(GenericTypes.Select(e => e.FromNode()).ToArray());
var asEnumerabled = asEnumerableMethod.Invoke(null, new object[] { Value });
.Call System.Linq.Queryable.Select(
.Call System.Linq.Queryable.Where(
.Call Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.Include(
.Call Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.Include(
.Constant<Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[EFCoreDataModel.DataClasses.Users.Base.User]>(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[EFCoreDataModel.DataClasses.Users.Base.User]),
'(.Lambda #Lambda1<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,EFCoreDataModel.DataClasses.Users.Employ.EmployeeInfo]>))
,
'(.Lambda #Lambda2<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Collections.Generic.ICollection`1[EFCoreDataModel.DataClasses.Notifications.Notification]]>))
,
'(.Lambda #Lambda3<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Boolean]>)),
'(.Lambda #Lambda4<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.String]>))
.Lambda #Lambda1<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,EFCoreDataModel.DataClasses.Users.Employ.EmployeeInfo]>(EFCoreDataModel.DataClasses.Users.Base.User $e)
{
$e.EmployeeInfo
}
.Lambda #Lambda2<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Collections.Generic.ICollection`1[EFCoreDataModel.DataClasses.Notifications.Notification]]>(EFCoreDataModel.DataClasses.Users.Base.User $f)
{
$f.Notifications
}
.Lambda #Lambda3<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Boolean]>(EFCoreDataModel.DataClasses.Users.Base.User $s)
{
.Call .Constant<System.Collections.Generic.List`1[System.Guid]>(System.Collections.Generic.List`1[System.Guid]).Contains($s.Id)
}
.Lambda #Lambda4<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.String]>(EFCoreDataModel.DataClasses.Users.Base.User $e)
{
$e.FullName
}
.Call System.Linq.Queryable.Select(
.Call System.Linq.Queryable.Where(
.Call Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.Include(
.Call Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.Include(
.Constant<Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[EFCoreDataModel.DataClasses.Users.Base.User]>(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[EFCoreDataModel.DataClasses.Users.Base.User]),
'(.Lambda #Lambda1<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,EFCoreDataModel.DataClasses.Users.Employ.EmployeeInfo]>))
,
'(.Lambda #Lambda2<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Collections.Generic.ICollection`1[EFCoreDataModel.DataClasses.Notifications.Notification]]>))
,
'(.Lambda #Lambda3<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Boolean]>)),
'(.Lambda #Lambda4<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.String]>))
.Lambda #Lambda1<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,EFCoreDataModel.DataClasses.Users.Employ.EmployeeInfo]>(EFCoreDataModel.DataClasses.Users.Base.User $e)
{
$e.EmployeeInfo
}
.Lambda #Lambda2<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Collections.Generic.ICollection`1[EFCoreDataModel.DataClasses.Notifications.Notification]]>(EFCoreDataModel.DataClasses.Users.Base.User $f)
{
$f.Notifications
}
.Lambda #Lambda3<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.Boolean]>(EFCoreDataModel.DataClasses.Users.Base.User $s)
{
.Call .Constant<System.Collections.Generic.List`1[System.Guid]>(System.Collections.Generic.List`1[System.Guid]).Contains($s.Id)
}
.Lambda #Lambda4<System.Func`2[EFCoreDataModel.DataClasses.Users.Base.User,System.String]>(EFCoreDataModel.DataClasses.Users.Base.User $e)
{
$e.FullName
}
s => tstList.Contains(s.Id)
var param1 = Expression.Parameter(typeof(User), "s");
var param2 = Expression.Parameter(typeof(User), "s");
var body = Expression.Equal(
Expression.Property(param2, "Id"),
Expression.Constant(new Guid("D45E1A1A-F546-48DB-77BA-08D7775C6A93"))
);
var predicate = Expression.Lambda<Func<Blog, bool>>(body, param1);
var test = testDb.Set<User>().Where(predicate).ToList();