0

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

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

有什么方法可以根据上述情况为我的解释器定义 TOTAL 表达式?

4

1 回答 1

0

你写了:

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

唉,LINQ 旨在从序列中选择数据。LINQ 不会更改输入序列。

幸运的是,您还写道:

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

好的,我们可以做到。

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

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

因此,我们将为您的实体编写一个单独的扩展函数,而不是更改您的实体类。对于您的班级的用户,它看起来好像该函数是班级的一部分。请参阅揭秘的扩展方法

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

输入:某种类型的可查询对象序列和一个双精度值Value
另外:a> 属性选择器,它选择具有双精度值的对象的获取属性。
输出:获取属性的总和Value和值。

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);
于 2018-08-30T07:38:24.527 回答