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

标签 c# entity-framework linq reflection

我正在尝试动态创建以下 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 表达式(即属性分配)。

关于c# - 创建动态 Linq 到 EF 表达式以选择 IQueryable 到新类中并分配属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33411839/

相关文章:

c# - 非零值的 Linq Min()

c# - C# 中是否存在 __LINE__ __FILE__ 等价物?

c# - 使用 C# 解析 HTML 和计数标签

.net - 在 n 层应用程序中将连接字符串放在哪里?

c# - 使用两个条件拆分字符串

c# - 如何通过Azure应用程序注册实现多资源授权?

c# - Web API 和 Entity Framework ,在哪里指定数据库连接?

entity-framework - 如何在不使用导航属性的情况下在 codefirst 中设置外键关系?

c# - GROUP BY、ORDER BY 和 LINQ 中的第一

c# - 我可以在 C# 中声明全局推断变量吗?