如何在此 Entity Framework IQueryable 查询中抽象出 select?

How do I abstract out the select in this Entity Framework IQueryable query?

我有以下 Entity Framework 个查询:

var items1 = items.Select(x=> x.Prop1)
                  .Select(...).OrderBy(..).ToArray();

var items2 = items.Select(x=> x.Prop2)
                  .Select(...).OrderBy(..).ToArray();

var items3 = items.Select(x=> x.Prop3)
                  .Select(...).OrderBy(..).ToArray();

如您所见,这是重复的代码。

下面的.Select(...).OrderBy(..).ToArray();完全一样

我似乎找不到提取第一个的方法select

有点像,

var temp = Select(x=> x.Prop1);

我想最终使用反射将它变成一个 for 循环,但是上面的语句给了我一个编译错误。

该应用程序是在 .Net 4 上运行的,所以我无法访问任何可能用于解决此问题的新功能。

只需将其移动到另一个函数即可:

ResultType[] Execute(IQueryable<TypeOfProps> query) {
     return query.Select(...).OrderBy(..).ToArray()
}

如果您不想创建单独的函数 - 创建匿名函数:

Func<IQueryable<TypeOfProps>,ResultType[]>> execute = (query) => 
    query.Select(...).OrderBy(..).ToArray();
var items1 = execute(items.Select(x=> x.Prop1));
var items2 = execute(items.Select(x=> x.Prop2));
var items3 = execute(items.Select(x=> x.Prop3))

您可以定义一个方法,给定第一个 Selects lambda,计算结果:

ResultType[] YouCarefullyChoosenName(Expression<Func<InputType, string>> propSelector)
{
    return items.Select(propSelector).Select(...).OrderBy(..).ToArray();
}

var items1 = YouCarefullyChoosenName(x => x.Prop1);
var items2 = YouCarefullyChoosenName(x => x.Prop2);
var items3 = YouCarefullyChoosenName(x => x.Prop3);