表达式树来构建子选择结果

时间:2017-04-12 16:58:14

标签: c# linq expression expression-trees

我尝试使用表达式树构建子查询。在linq中我会写一些类似的东西:

var single = MyTable
    .AsExpandable()
    .Select(c => new
    {
        Childs = Enumerable.Select(
            MyTable.VisibleChilds.Invoke(c, dbContext),
            cc => Convert(cfg.ChildsConfig).Invoke(dbContext, cc))
    });

其中Convert正在构建类似

的表达式
p => new MyTableSelect {
    Id = p.Id,
    Name = p.Name
}

取决于配置中的给定值(仅从数据库中读取所需数据)。

但是我要将第二个参数转移到Select调用,因为我需要将cc传递给Convert-call。

我想我需要像Expression.Lambda<Func<>>这样的东西,但我不会看到它。

  

Expression.Lambda&gt;(Expression.Invoke(Instance.Convert(cfg.ChildOrganizersFilterConfig),ContextParameter,theEntity));

1 个答案:

答案 0 :(得分:0)

我不熟悉您对Invoke的使用,但如果您只想运行转换器&#39;用于Linq表达式的流畅语法我可以向您展示一个例子。假设我有三个POCO类,一个父容器,一个子容器和一个我想要转换为的容器。

Public Sub Init(ByVal category1 As String)
    ReDim pCategories(0 To 29) As String
    pCategories(0) = category1
End Sub

我可以写一个转换器方法将ChildPOC带到ChildPOCAlter,如下所示:

With foo
    .Init "bar"
    .Category(1) = "smurf"
    .Category(2) = "blah"
    '...
End With

然后我可以填充一些数据:

public class POC
{
    public int Id { get; set; }
    public string Name { get; set; }

    public POC(int id, string name)
    {
      Id = id;
      Name = name;
    }
}

public class ChildPOC
{
    public int ParentId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ChildPOC(int parentId, string firstName, string lastName)
    {
      ParentId = parentId;
      FirstName = firstName;
      LastName = lastName;
    }
}
public class ChildPOCAlter
{
    public int ParentId { get; set; }
    public string Name { get; set; }

    public ChildPOCAlter(string first, string last, int parentId)
    {
      ParentId = parentId;
      Name = $"{first} {last}";
    }
}

然后我可能想要采用这些关系并在其上直接应用转换器:

public static Converter<ChildPOC, ChildPOCAlter> ChildPOCOAlter()
{
  return new Converter<ChildPOC, ChildPOCAlter>((x) => { return new ChildPOCAlter(x.FirstName, x.LastName, x.ParentId); });
}