DynamicExpresso:表达式作为变量

时间:2018-08-29 05:21:28

标签: c# .net linq dynamic-expresso

假设我们有一个名为TOTAL的变量,应将其替换为CClass的AProperty + BProperty。 我有一组IQueryrable CClass对象,我想从这组对象中选择(TOTAL + AProperty)。

AProperty和BProperty是双精度值。我不想扩展我的类,因为它是数据库中的一个实体类,而TOTAL表达式实际上是一个运行时用户定义的变量。因此,我不想通过反射或其他解决方案注入它们。我想让最终用户能够声明一些类似于MACRO的变量,以基于它们创建更复杂的表达式。

是否可以根据上述情况为解释器定义TOTAL表达式?

1 个答案:

答案 0 :(得分:0)

您写道:

  
    

我们有一个名为TOTAL的变量,应将其替换为...

  

A,LINQ用于从序列中选择数据。 LINQ不会更改输入顺序。

幸运的是,您还写道:

  

我有一组IQueryrable CClass对象,我想从这组对象中选择(TOTAL + AProperty)。

好的,我们可以做到。

  

我不想更改班级...

当然,您不想更改实体类:您的实体类表示数据库中的表以及这些表之间的关系。您的函数通常不是数据库表中的函数。因此它不属于那里。

因此,我们将为您的实体编写一个单独的扩展功能,而不是更改您的实体类。对于您班级的用户,函数似乎是班级的一部分。参见Extension Methods demystified

我不会为您的IQueryable<CClass>编写函数,而是为任何可查询的对象序列编写函数

  

输入:某种类型的对象的可查询序列和双值Value
  另外:a>属性选择器,用于选择具有以下属性的对象的获取属性   双重价值。
  输出Value与get-property的值之和。

public static double AddToProperty<TSource> (this IEnumerable<TSource> source, 
     Expression<Func<TSource, double>> propertySelector,        
     double value);
     where Tsource : class
{
     return source.Select(soureElement => propertySelector(sourceElement) + value);
}

用法:

var addedTotals = myDbContext.Students
    .AddToPropery( student => student.AnnualIncome, 3.14);