簡體   English   中英

表達式樹構建子選擇結果

[英]Expression-tree to build sub-select results

我正在嘗試通過使用表達式樹來構建子查詢。 在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>(Expression.Invoke(Instance.Convert(cfg.ChildOrganizersFilterConfig),ContextParameter,theEntity));

我不熟悉您對Invoke的使用,但是如果您只想以流利的語法運行“轉換器”以在Linq表達式中使用,我可以為您提供一個示例。 假設我有三個POCO類,一個父容器,一個子容器和一個我想轉換為的容器。

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,如下所示:

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

然后,我可以填充一些數據:

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

然后,我可能需要考慮這些關系,並直接在其上應用轉換器:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM