如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

迈克·戴蒙德

我可以找到许多有关如何更改表达式主体的信息,但找不到任何有关如何更改ReturnType的信息。

这是我编写的代码,其中包含对下面给出的Convert例程的调用。

    private T[] CheckCreatedOnDate<T>(Expression<Func<T, object>> fieldExpression, T[] input, Data.Context context) where T : Entity
    {
        var fieldDelegate = fieldExpression.Compile();

        Expression<Func<T, bool>> predicateExpression = Convert(fieldExpression);  
        Func<T, bool> predicateDelegate = predicateExpression.Compile();
        Predicate<T> predicate = predicateDelegate.Invoke;

        DbSet<T> dbSet = context.Set<T>();
        var data = dbSet.ToList();

        foreach (T inputRecord in input)
        {
            var fieldObject = fieldDelegate.Invoke(inputRecord);

            var dataRecord = data.SingleOrDefault(x => Equals(predicate, fieldObject));

            if (dataRecord != null)
            {
                inputRecord.CreatedOn = dataRecord.CreatedOn;
            }
        }

        return input;
    }

此方法的行为应与EF中的AddOrUpdate方法非常相似,但是,如果记录已存在于Db中,则此方法将仅替换createdOn日期。

但是,我的代码仍然无法正常工作。创建的谓词似乎不正确,因为它从未在Db中找到相关记录。

所有帮助,不胜感激。

干杯迈克

克里斯托弗

假设这fieldExpression就像(T e) => e.Field我得出的结论,即您希望在DB记录中找到具有相同Field值的东西

试试这个:

foreach (T inputRecord in input)
{
    object fieldObject = fieldDelegate.Invoke(inputRecord);

    ParameterExpression p = fieldExpression.Parameters.First();
    // Equivalent to x => x.Field == fieldObject
    Expression<Func<T, bool>> predicate = Expression.Lambda<Func<T, bool>>(
        // input.Field == fieldObject
        Expression.Equal(
            // input.Field
            fieldExpression.Body,
            // constant from fieldObject
            Expression.Constant(fieldObject)
        ),
        new []{ p }
    );

    T dataRecord = dbSet.SingleOrDefault(predicate);

    if (dataRecord != null)
    {
        inputRecord.CreatedOn = dataRecord.CreatedOn;
    }
}

我通过获取fieldExpressionbody在每个循环中创建一个全新的谓词,并将其传递给SingleOrDefault调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

将表达式转换为Expression <Func <T,bool >>

将Func <T,TProperty>转换为Expression <Func <T,Property >>

将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

将Expression <Func <T,U >>转换为Expression <Func <object,object >>

C#Func <T,bool>与Expression <Func <T,bool >>

方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

将Expression <Action <T >>转换为Expression <Func <T >>

无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

将 func(T) 转换为 func(any)

如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

如何将表达式Func <T,object []>转换为Func <T,object>

正文Expression <Func <T,bool >>的复杂编辑

将Expression <Func <T,bool >>与bool进行比较

如何在C#中将LambdaExpression转换为Expression <Func <T,bool >>

如何将Func <T,object>转换为Func <Exception,object>

将谓词<T>转换为Func <T,bool>

用类型强制类型转换Expression <Func <T,bool >>

将Expression <Func <TEntity,IEnumerable <TProperty >>> valueSelector,TValue []值转换为Expression <Func <TElement,bool >>

EF Expression <Func <T,object >>属性检测

如何将Expression <Func <TEntity,bool >>映射到Expression <Func <TDbEntity,bool >>

将Expression <Func <TClass,TField >>转换为Expression <Func <TClass,object >>

将Expression <Func <TDocument,object >>转换为Expression <Func <TDocument,TOutput >>

将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

如何将多个Expression <Func <T,bool >>组合为单个表达式以针对DbContext执行?

从Expression <Func <T,bool >>实体框架返回所有实体