创建一个动态Linq to EF表达式以将IQueryable选择到新类中并分配属性

我正在尝试动态创建以下Linq的等效项。

IQueryable<TypeOne> ones;
ones.Select(i => new TypeTwo { TwoProp = i.OneProp });

到目前为止,我有以下代码,但没有。

public class TypeOne
{
    public string OneProp { get; set; }
}

public class TypeTwo
{
    public string TwoProp { get; set; }
}

public static IQueryable<TypeTwo> Tester(IQueryable<TypeOne> data)
{
    ConstructorInfo constructor = typeof(TypeTwo ).GetConstructor(new Type[] { });
    Expression body = Expression.New(constructor);

    ParameterExpression oneParam = Expression.Parameter(typeof(TypeOne), "one");
    Expression prop1 = Expression.Property(oneParam, "OneProp");

    ParameterExpression twoParam = Expression.Parameter(typeof(TypeTwo ), "two");
    Expression prop2 = Expression.Property(twoParam, "TwoProp");

    Expression assign = Expression.Assign(prop2, prop1);
    body = Expression.Block(body, assign);

    return data.Select(Expression.Lambda<Func<TypeOne, TypeTwo >>(body, oneParam));
}

但是我得到以下异常:

附加信息:类型'System.String'的表达式不能用于返回类型'TypeTwo'

伊万·斯托夫

您应该为此使用Expression.MemberInit,如下所示:

public static IQueryable<TypeTwo> Tester(IQueryable<TypeOne> data)
{
    var source = Expression.Parameter(typeof(TypeOne), "source");
    var selector = Expression.Lambda<Func<TypeOne, TypeTwo>>(
        Expression.MemberInit(Expression.New(typeof(TypeTwo)),
            Expression.Bind(typeof(TypeTwo).GetProperty("TwoProp"), Expression.Property(source, "OneProp"))),
        source);
    return data.Select(selector);
}

您可以根据需要包含任意多个Expression.Bind表达式(即属性分配)。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用表达式在LINQ中分配属性选择新

创建一个创建动态表达式的方法

创建一个新的类“动态”?

在 linq to EF 中,我可以创建一个动态查询来搜索用户指定的字段吗

创建并动态分配一个类的多个版本

在循环 NodeJs 中动态创建一个类

在 R 中动态创建一个新列

创建一个将容纳LINQ查询的类?

动态创建一个从ABC类派生的类

创建一个动态分配的std :: vectors数组

创建一个分配动态矩阵的函数

创建一个动态类,该类继承该类

动态创建一个返回对象属性的getter

如何动态创建一个属性少的结构?

在EmberJS中创建一个完全动态的表

在gwt中动态创建一个span元素

在另一个对象中动态创建对象

从 PHP 中的动态内容创建一个简单的 RSS

在React中创建一个动态的onClick函数

命名;在javascript中动态创建一个变量

试图在python中创建一个动态主机文件

在 pandas/pyspark 中动态创建一个总计行?

一个ForEach函数,使一个tr到三个tds并创建一个动态表

更改动态创建的选择的onchange事件,以填充另一个动态创建的选择

LINQ:选择一个对象并更改一些属性,而无需创建新对象

如何简单地创建一个Linq表达式的集合作为参数?

如何在 C# 中使用 LinqExpression 创建一个动态获取属性的表达式?

创建一个动态EF过滤器,该过滤器为任何字符串实体属性构建一个LINQ where equals / contains语句

将动态div附加到另一个先前动态创建的div中