gpt4 book ai didi

c# - 组合相同输入类型的选择表达式

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:00 24 4
gpt4 key购买 nike

比方说,我有这些在派生类中被覆盖的属性。

protected virtual Expression<Func<TEntity, long>> GetIDExpr { get; }
protected virtual Expression<Func<TEntity, string>> GetNameExpr { get; }
protected virtual Expression<Func<TEntity, long>> GetValueExpr { get; }

现在说我有这门课

public class MyData
{
public long ID { get; set; }
public string Name { get; set; }
public long Value { get; set; }
}

现在,在基类中,我将如何制作 Expression<Func<TEntity, MyData>>调用时,将填充每个字段并允许我创建一个返回 IEnumerable<MyData> 的方法?

我想避免使用 Invoke ,因为我只希望从数据库中选择这 3 个字段。

注意:为了这个示例,将每个属性视为每次调用时都返回表达式的相同实例,而不是每次都创建一个新实例。

编辑:

这是我的尝试,但没有用:

public IEnumerable<MyData> GetAllData(IQueryable<TEntity> table) {
ParameterExpression parameter = Expression.Parameter(typeof(TEntity), "obj");

List<MemberBinding> bindings = new List<MemberBinding> {
Expression.Bind(typeof(MyData).GetProperty("ID"), GetIDExpr.Body),
Expression.Bind(typeof(MyData).GetProperty("Name"), GetNameExpr.Body),
Expression.Bind(typeof(MyData).GetProperty("Value"), GetValueExpr.Body),
};

var selector = Expression.MemberInit(Expression.New(typeof(MyData).GetConstructor(Type.EmptyTypes)), bindings);

var getBar = Expression.Lambda<Func<TEntity, MyData>>(selector, parameter);

return table.Select(getBar);
}

这里我在执行查询时得到一个 ArgumentException,说

The parameter 'obj' was not bound in the specified LINQ to Entities query expression.

我假设这意味着使用 .Body对于值表达式将不起作用,因为不再有参数。但是,如果我不使用 .Body , 我在 .Bind 上得到一个异常方法

Argument types do not match

最佳答案

我不知道有什么方法可以将 lambda 表达式中的其他表达式树组装成表达式树,所以我认为您必须以编程方式构建树。这篇 MSDN 文章 ( How to: Use Expression Trees to Build Dynamic Queries) 展示了如何使用表达式树 API 构建表达式树。

在这种情况下,您需要一个 new 表达式,后跟三个属性赋值;我不认为你可以在表达式树中做到这一点。您可以通过创建一个分配属性的构造函数来解决这个问题。

关于c# - 组合相同输入类型的选择表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9808707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com