C# 使用lambda语法在表达式树中组合表达式

C# 使用lambda语法在表达式树中组合表达式,c#,linq,lambda,expression-trees,C#,Linq,Lambda,Expression Trees,我正在构建一个从各种存储库中检索类似Enum的实例的服务。存储库以不同的方式存储数据,但所有数据都可以检索到EnumEntry{int Id;string Name;}类中 我的想法是使用一个基类,该基类将Func委托作为选择器来标识每个底层存储库记录上的Id和Name字段。e、 g // constructor: BaseEnumService<T>(Table<T> table, Expression<Func<T,

我正在构建一个从各种存储库中检索类似Enum的实例的服务。存储库以不同的方式存储数据,但所有数据都可以检索到EnumEntry{int Id;string Name;}类中

我的想法是使用一个基类,该基类将Func委托作为选择器来标识每个底层存储库记录上的Id和Name字段。e、 g

// constructor:
BaseEnumService<T>(Table<T> table, 
                   Expression<Func<T, int>> idSelector, 
                   Expression<Func<T, string>> nameSelector) {... }

// usage
var caseCategoryService = new BaseEnumService(CaseCategoriesTable, x => x.id, x => x.category)
…但是数据库IQueryable实现会抱怨,因为它不喜欢“外部”功能

将所有内容与表达式树相结合可以正常工作,例如

var record = Expression.Parameter(typeof(T));
 Expression<Func<int, string, EnumEntry>> createEnumExpression = (id, name) => new EnumEntry() { Id = id, Name = name };
var selectExpression = Expression.Invoke(createEnumExpression,
                Expression.Invoke(idSelector, record),
                Expression.Invoke(nameSelector, record));

return table.Select(Expression.Lambda<Func<T, EnumEntry>>(selectExpression, record));
var记录=表达式.参数(typeof(T));
表达式createEnumExpression=(id,name)=>newEnumEntry(){id=id,name=name};
var selectExpression=Expression.Invoke(createEnumExpression,
Expression.Invoke(idSelector,record),
Invoke(namelector,record));
return table.Select(Expression.Lambda(selectExpression,record));
。。但对于如此简单的事情来说,这似乎相当冗长和丑陋

没有办法像我最初尝试的那样使用lambda语法组合表达式吗

var record = Expression.Parameter(typeof(T));
 Expression<Func<int, string, EnumEntry>> createEnumExpression = (id, name) => new EnumEntry() { Id = id, Name = name };
var selectExpression = Expression.Invoke(createEnumExpression,
                Expression.Invoke(idSelector, record),
                Expression.Invoke(nameSelector, record));

return table.Select(Expression.Lambda<Func<T, EnumEntry>>(selectExpression, record));