尝试创建一个干净的表达式,导致 IResult 为数组

Trying to create a clean expression, resulting in the IResult as an array

我正在尝试创建一个 ORM 作为副项目。但我似乎无法找出将结果作为 Func<> 中的数组输出的最佳方式。我现在基本上得到的是:

IMySqlAccess<T> OrderBy(Expression<Func<T, object[]>> orderByValues, bool ascending);
// Which results in
.OrderBy(x => new object[] { x.Id, x.Email, x.FirstName, x.LastName }, false);

有没有人知道有更好的方法来输出结果而不是必须创建一个对象数组?最终结果可能看起来像这样,我还不知道:

.OrderBy(x => { x.Id, x.Email, x.FirstName, x.LastName }, false);
// Or even better
.OrderBy(x => x.Id, x.Email, x.FirstName, x.LastName, false);
// Although that is probably impossible

非常感谢您的关注。

您可以使用 Func<T, object>:

IMySqlAccess<T> OrderBy(Expression<Func<T, object>> orderByValues, bool ascending);

假设用法:

.OrderBy(x => new { x.Id, x.Email, x.FirstName, x.LastName }, false);

.OrderBy(x => x.Id , false);

您还可以在实施自己的 IQueryable 提供程序时在标准 OrderBy 中添加对 NewExpression 的支持。

不要使用 Expression<Func<T, object[]>> 类型的单个表达式,而是使用 Expressions<Func<T, object>>[]params 数组(注意 [] 的位置)并移动你的布尔值属性 到前面,或删除它并为降序创建重载:

IMySqlAccess<T> OrderBy(bool ascending, params Expression<Func<T, object>>[] orderByValues); 

// usage
whatever.OrderBy(false, x => x.Id, x => x.Email, x => x.FirstName, x => x.LastName);

或者:

IMySqlAccess<T> OrderBy(params Expression<Func<T, object>>[] orderByValues); 
IMySqlAccess<T> OrderByDescending(params Expression<Func<T, object>>[] orderByValues); 

// usage
whatever.OrderBy(x => x.Id, x => x.Email, x => x.FirstName, x => x.LastName);
whatever.OrderByDescending(x => x.Id, x => x.Email, x => x.FirstName, x => x.LastName);

这将更容易在 ORM 方面进行解构,因为现在您只需直接查看一堆 MemberExpressions(半)。您不需要从匿名对象的创建中提取 NewExpressionMemberInitExpression,这可能会令人头疼。唯一的“缺点”是您要验证数组的 Length 是否大于零。