表达式树构建子选择结果 [英] Expression-tree to build sub-select results

查看:153
本文介绍了表达式树构建子选择结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用表达式树来构建一个子查询。在linq中,我会写下如下:

I'm trying to build a sub-query by using expression-trees. In linq I would write something like:

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

其中转换正在构建一个表达式

where the Convert is building an expression like

p => new MyTableSelect {
    Id = p.Id,
    Name = p.Name
}

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

depending on the given values from the config (to only read needed data from database).

但是我正在努力使用第二个参数传递到选择呼叫,因为我需要 cc 传递到转换呼叫。

but I'm struggeling with the second parameter to be passed to the Select call as I need cc to be passed to the Convert-call.

我想我需要一些类似 Expression.Lambda&FunC<> 但我看不到它。

I guess I need something like Expression.Lambda<Func<>> but I don't see it.



推荐答案

我不熟悉您使用Invoke,但如果您只想以流畅的语法运行转换器在Linq表达式中使用我可以给你一个例子。说我有三个POCO类,一个父容器,一个子容器和一个我要转换的容器。

I am not familiar with your use of Invoke but if you just want to run a 'Converter' in a fluent syntax for use in a Linq Expression I could show you an example of that. Say I have three POCO classes, one parent container, a child container, and a container I want to convert to.

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}";
    }
}

我可以编写一个转换器方法来将ChildPOC取代到ChildPOCAlter像这样:

I could write a converter method to take ChildPOC to ChildPOCAlter like so:

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

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

I could then populate some data:

var someParents = new List<POC> { new POC(1, "A"), new POC(2, "B") };
var somechildren = new List<ChildPOC> { new ChildPOC(1, "Brett", "x"), new ChildPOC(1, "Emily", "X"), new ChildPOC(2, "John", "Y") };

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

And then I may want to take these relationships and apply a converter directly on it:

var relationships = someParents.Select(x => new
{
    Id = x.Id,
    Name = x.Name,
    Children = somechildren.Where(y => y.ParentId == x.Id).ToList().ConvertAll(ChildPOCOAlter())
});

这篇关于表达式树构建子选择结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆