如何重构LINQ select语句

时间:2013-10-15 09:38:16

标签: c# linq entity-framework-5

鉴于以下LINQ语句,有人可以告诉我是否可以将选择部分重构为表达式树?我之前没有使用表达式树,也没有找到关于Selects的更多信息。注意这是要翻译成SQL并在SQL Server内部运行,而不是在内存中运行。

var results = db.Widgets
    .Select(w => new
    {
        Name = (w is x) ? "Widget A" : "Widget B"
    });

我希望能够做到这一点..

var name = [INSERT REUSABLE EXPRESSION]
var somethingElse = [INSERT REUSABLE EXPRESSION]
var results = db.Widgets.Select(w => new { Name = name, SomethingElse = somethingElse });

显然,预期用途是用于更复杂的陈述。

1 个答案:

答案 0 :(得分:0)

您可以使用LinqKit执行此操作。只要您的方法可以转换为SQL,它就会起作用。这基本上就是一个完整的例子:

public static class ReusableMethods
{
    public static Expression<Func<int, Person>> GetAge()
    {
        return p => p.Age;
    }
}

var getAge = ReusableMethods.GetAge();
var ageQuery = from p in People.AsExpandable()
               select getAge.Invoke(p);

请注意:

  1. 您需要将AsExpandable()添加到IQueryable。
  2. 在使用之前,您必须将方法分配给局部变量(不确定原因,但必须确定原因)。