DynamicExpresso:表达式作为变量

问题描述 投票:0回答:1

假设我们有一个名为TOTAL的变量,它应该用CClass的AProperty + BProperty替换。我有一套IQueryrable CClass对象,我想从这个集合中选择(TOTAL + AProperty)。

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

有没有办法根据上面的场景为我的翻译定义TOTAL表达式?

c# .net linq dynamic-expresso
1个回答
0
投票

你写了:

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

唉,LINQ意味着从序列中选择数据。 LINQ不会改变输入序列。

幸运的是你还写道:

我有一组IQueryable CClass对象,我想从这个集合中选择(TOTAL + Property)。

好的,我们可以做到。

我不想改变我的班级......

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

因此,我们不会更改您的实体类,而是为您的实体编写单独的扩展函数。对于您的类的用户,它看起来好像该函数是该类的一部分。见Extension Methods demystified

我不会为你的IQueryable<CClass>编写函数,我会为任何可查询的对象序列编写一个函数

输入:某种类型的可查询对象序列和双值Value。 另外:a>属性选择器,用于选择具有double值的对象的get属性。 输出: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);
© www.soinside.com 2019 - 2024. All rights reserved.