假设我们有一个名为TOTAL的变量,应将其替换为CClass的AProperty + BProperty。 我有一组IQueryrable CClass对象,我想从这组对象中选择(TOTAL + AProperty)。
AProperty和BProperty是双精度值。我不想扩展我的类,因为它是数据库中的一个实体类,而TOTAL表达式实际上是一个运行时用户定义的变量。因此,我不想通过反射或其他解决方案注入它们。我想让最终用户能够声明一些类似于MACRO的变量,以基于它们创建更复杂的表达式。
是否可以根据上述情况为解释器定义TOTAL表达式?
答案 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);