Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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# //创造。相反,使用的表达式会导致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

您可以在my on中找到CollectionConstantPredicateBuilder。

但异常消息中的
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();