假设我们有一个名为TOTAL的变量,它应该用CClass的AProperty + BProperty替换。我有一套IQueryrable CClass对象,我想从这个集合中选择(TOTAL + AProperty)。
AProperty和BProperty是双重值。我不想扩展我的类,因为它是我的数据库中的实体类,实际上TOTAL表达式是运行时用户定义的变量。因此我不想通过Reflection或其他解决方案注入它们。我想让最终用户能够声明一些MACRO喜欢的变量来创建基于它们的更复杂的表达式。
有没有办法根据上面的场景为我的翻译定义TOTAL表达式?
你写了:
我们有一个名为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);