C# 试图创建一个干净的表达式,导致IResult作为数组

C# 试图创建一个干净的表达式,导致IResult作为数组,c#,expression,func,C#,Expression,Func,我正在尝试创建一个ORM作为辅助项目。但我似乎无法找出在Func中以数组形式输出结果的最佳方法。我现在基本上得到的是: imysqlacces OrderBy(表达式orderbyvalue,bool升序); //导致 .OrderBy(x=>newobject[]{x.Id,x.Email,x.FirstName,x.LastName},false); 有人知道一种更好的输出结果的方法,而不必制作对象数组吗?最终结果可能是这样的,我还不知道: .OrderBy(x=>{x.Id,x.Emai

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

imysqlacces OrderBy(表达式orderbyvalue,bool升序);
//导致
.OrderBy(x=>newobject[]{x.Id,x.Email,x.FirstName,x.LastName},false);
有人知道一种更好的输出结果的方法,而不必制作对象数组吗?最终结果可能是这样的,我还不知道:

.OrderBy(x=>{x.Id,x.Email,x.FirstName,x.LastName},false);
//甚至更好
.OrderBy(x=>x.Id,x.Email,x.FirstName,x.LastName,false);
//虽然这可能是不可能的
非常感谢您对此进行研究。

您可以使用
Func


另外,在实现自己的
IQueryable
提供程序时,您可以在标准
OrderBy
中添加
NewExpression
以支持

而不是使用一个
expression
类型的表达式,而是使用
表达式[]
参数数组(注意
[/code>的位置)然后将布尔属性移到前面,或者将其删除并创建降序重载:

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);
imysqlacces OrderBy(bool升序,参数表达式[]orderByValues);
//用法
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);
IMySqlAccess OrderBy(参数表达式[]orderByValues);
IMYSQLCESS OrderByDescending(参数表达式[]orderByValues);
//用法
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方面,这将更容易解构,因为现在您只需直接查看一堆
成员表达式。您不需要从匿名对象的创建中提取
NewExpression
MemberInitExpression
s,这可能会让人头疼。唯一的“缺点”是您需要验证数组的
长度是否大于零。

我认为从使用角度来看,OP的变体更好。我不得不同意这一点,解构这一点会容易得多。非常感谢@GuruStron为了创建匿名对象而解构表达式是一件痛苦的事。对于这个版本,它就像
(PropertyInfo)((MemberExpression)(orderByValues[index.Body])一样简单。Member
@pinkfloydx33对于我来说,作为一个库的用户编写多个lambda是一件痛苦的事=)我自己编写了一个ORM,我强烈建议不要使用任何一个版本。我会尝试跟随LINQ,因为其他人会习惯于这样,一次只传递一个值。然后返回一个fluent样式的接口,该接口跟踪要排序的成员,并且只在最后(执行时)提取所有成员
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);