【问题标题】:How do I abstract out the select in this Entity Framework IQueryable query?如何抽象出此实体框架 IQueryable 查询中的选择?
【发布时间】:2017-04-07 21:29:07
【问题描述】:

我有以下实体框架查询:

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();一模一样。

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

类似的,

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

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

该应用程序位于 .Net 4 上,因此我无法访问任何可能解决此问题的新内容。

【问题讨论】:

  • Prop1\2\3 都是同一种类型?
  • 是的,它们都是字符串

标签: c# entity-framework lambda expression iqueryable


【解决方案1】:

只需将其移至另一个函数:

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))

【讨论】:

  • 在第二个中,选择的顺序正在改变。会影响结果吗?
  • 怎么改的?你说这三个都是“完全一样的”。
【解决方案2】:

你可以定义一个方法,给定第一个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);

【讨论】:

  • 我更喜欢这个而不是 Evk 的回答,因为它还抽象出了第一个 Select 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多