繁体   English   中英

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

[英]Create a Dynamic Linq to EF Expression to Select IQueryable into new class and assign properties

我试图动态创建以下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表达式(即属性赋值)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM